在某些情况下,使用Spring-JDBC,我们需要根据不同类型的数据库报告编写业务代码。例如,我们具有这样的逻辑。如果我们新插入记录,则存在一个独特的冲突,我们将返回客户描述:记录存在,请不要重复操作代码。
有测试:
如上图所示,无论替换哪个数据库(Spring-JDBC支持),代码都不需要更改代码
因此,当Spring-JDBC使用不同的数据库时,Spring如何帮助我们获得抽象?
让我们看一下代码:首先输入jdbctemplate.execute方法:
内部方法执行
异常转换方法TranslateException
GetExceptionTranslation
转换方法:因为默认转换器是SQLERRORODESQLEXECTECTINSLATOR,因此请致电SQLERRORCODESQLEXCEXTECTINTRANSLAT
分类关系如上所述。实际的第一个调用Abstract fallllllllllllllllllllllllllllllllllllllllllllalatoraator.transle
实际转换类Sqlercodesqlexceptiontranslanslanslans:
以上SQLERRORCODES是一个错误代码的集合,但不是所有数据库中的所有错误代码,而是相应数据库的错误代码集合。关于代码?当然,在SQLERRORCODESQLORCODESCLECTIONPECTIONTRANTAR中实现了Spring:
错误代码工厂sqlercodesfactory的resolveerrorcodes方法:
CACHE DATASOURCECACHE如何生成?
SQL-Error-codes.xml文件配置为每个数据库的主要错误代码。MySQL部分列举了。当然,还有其他部分。
您已经看到,例如,以上错误代码值列出了错误代码的一部分。如果没有其中的错误代码,则不得匹配它。当然,春天可以想到这一点。
SqlerrorCodesqlexceptintranslator的后转换器是什么?
sqlexceptionsubclasslanslation的转换方法如下:如下:
sqlstatesqlexceptiontranslars的转换方法:
public void execute(Final String SQL)抛出dataAccessexception {
if(this.logger.isdebugenabled()){{{
this.logger.debug(“执行sql语句[“ + sql +”]);
}
Em
//实际执行入口
this.execute(new executestatatementCallback(),true);
} 4为什么SQLSTATATATATE获得错误类型?
因为数据库基于X/Open和SQL Access组的定义SQL CAE(1992),所以SQLERROR返回SQLSTATE值。SQLSTATE值是一个包含五个字符的字符串。Five字符包括数值或大写字母,代表代码,SQLSTATE具有分层模式:前两个字符识别条件通常表示错误条件类别,后三个字符表示通用类中的子类。成功状态由00000识别。代码在SQL标准中的大多数地方定义
组合模式
您是否发现上图中三个实现类之间的关系?
SQLERRORCODESFACTORY中的单个模式
策略模式根据数据库获得不同的错误代码集。
作者:程序员A NIU