• Spring之 JDBC 异常


    JDBC异常抽象

    Spring会将数据操作的异常转换为DataAccessException

    Spring之 JDBC 异常

     

    解析错误码

    1. SQLErrorCodeSQLExceptionTranslator
    2. ErrorCode定义
    • org/springframework/jdbc/support/sql-error-codes.xml
    • classpath下的sql-error-codes.xml(定制)

    org/springframework/jdbc/support/sql-error-codes.xml

    Default SQL error codes for well-known databases. Can be overridden by definitions in a “sql-error-codes.xml” file in the root of the class path.

    <bean id="H2" class="org.springframework.jdbc.support.SQLErrorCodes">
    <property name="badSqlGrammarCodes">
    <value>42000,42001,42101,42102,42111,42112,42121,42122,42132</value>
    </property>
    <property name="duplicateKeyCodes">
    <value>23001,23505</value>
    </property>
    <property name="dataIntegrityViolationCodes">
    <value>22001,22003,22012,22018,22025,23000,23002,23003,23502,23503,23506,23507,23513</value>
    </property>
    <property name="dataAccessResourceFailureCodes">
    <value>90046,90100,90117,90121,90126</value>
    </property>
    <property name="cannotAcquireLockCodes">
    <value>50200</value>
    </property>
    </bean>
    <bean id="MySQL" class="org.springframework.jdbc.support.SQLErrorCodes">
    <property name="databaseProductNames">
    <list>
    <value>MySQL</value>
    <value>MariaDB</value>
    </list>
    </property>
    <property name="badSqlGrammarCodes">
    <value>1054,1064,1146</value>
    </property>
    <property name="duplicateKeyCodes">
    <value>1062</value>
    </property>
    <property name="dataIntegrityViolationCodes">
    <value>630,839,840,893,1169,1215,1216,1217,1364,1451,1452,1557</value>
    </property>
    <property name="dataAccessResourceFailureCodes">
    <value>1</value>
    </property>
    <property name="cannotAcquireLockCodes">
    <value>1205</value>
    </property>
    <property name="deadlockLoserCodes">
    <value>1213</value>
    </property>
    </bean>

    org.springframework.jdbc.support.SQLErrorCodes

    public class SQLErrorCodes {
    @Nullable
    private String[] databaseProductNames;
    private boolean useSqlStateForTranslation = false;
    private String[] badSqlGrammarCodes = new String[0];
    private String[] invalidResultSetAccessCodes = new String[0];
    private String[] duplicateKeyCodes = new String[0];
    private String[] dataIntegrityViolationCodes = new String[0];
    private String[] permissionDeniedCodes = new String[0];
    private String[] dataAccessResourceFailureCodes = new String[0];
    private String[] transientDataAccessResourceCodes = new String[0];
    private String[] cannotAcquireLockCodes = new String[0];
    private String[] deadlockLoserCodes = new String[0];
    private String[] cannotSerializeTransactionCodes = new String[0];
    @Nullable
    private CustomSQLErrorCodesTranslation[] customTranslations;
    @Nullable
    private SQLExceptionTranslator customSqlExceptionTranslator;
    }

    定制错误码

    项目路径

    └── src
    ├── main
    │ ├── java
    │ │ └── me
    │ │ └── zhongmingmao
    │ │ └── jdbcexception
    │ │ ├── CustomDuplicateKeyException.java
    │ │ └── JdbcExceptionApplication.java
    │ └── resources
    │ ├── application.properties
    │ ├── schema.sql
    │ └── sql-error-codes.xml
    └── test
    └── java
    └── me
    └── zhongmingmao
    └── jdbcexception
    └── JdbcExceptionApplicationTests.java

    sql-error-codes.xml

    src/main/resources/sql-error-codes.xml

    <beans>
    <bean id="H2" class="org.springframework.jdbc.support.SQLErrorCodes">
    <property name="badSqlGrammarCodes">
    <value>42000,42001,42101,42102,42111,42112,42121,42122,42132</value>
    </property>
    <property name="duplicateKeyCodes">
    <value>23001,23505</value>
    </property>
    <property name="dataIntegrityViolationCodes">
    <value>22001,22003,22012,22018,22025,23000,23002,23003,23502,23503,23506,23507,23513</value>
    </property>
    <property name="dataAccessResourceFailureCodes">
    <value>90046,90100,90117,90121,90126</value>
    </property>
    <property name="cannotAcquireLockCodes">
    <value>50200</value>
    </property>
    <!-- 定制:错误码为23001或23505时,不会抛出Spring的DuplicateKeyException,而是抛出CustomDuplicateKeyException -->
    <property name="customTranslations">
    <bean class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation">
    <property name="errorCodes" value="23001,23505"/>
    <property name="exceptionClass" value="me.zhongmingmao.jdbcexception.CustomDuplicateKeyException"/>
    </bean>
    </property>
    </bean>
    </beans>

    CustomDuplicateKeyException

    public class CustomDuplicateKeyException extends DuplicateKeyException {
    public CustomDuplicateKeyException(String msg) {
    super(msg);
    }
    public CustomDuplicateKeyException(String msg, Throwable cause) {
    super(msg, cause);
    }
    }

    单元测试

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class JdbcExceptionApplicationTests {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Test(expected = CustomDuplicateKeyException.class)
    public void testThrowCustomDuplicateKeyException() {
    jdbcTemplate.execute("INSERT INTO PERSON (ID, NAME) VALUES ('1', 'zhongmingmao')");
    jdbcTemplate.execute("INSERT INTO PERSON (ID, NAME) VALUES ('1', 'zhongmingwu')");
    }
    }

    最后,

    小编在这里分享一些学习资料,不止spring的异常问题,还有关于分布式,微服务,性能优化,Spring,MyBatis的等源码知识点的录像视频还有各种基础学习资料,及面试题资料哦!希望对大家在Java的学习中能够起到帮助!我是小架,一个专注于java学习的人,以后会有更多的新内容新知识点带给大家!

    Spring之 JDBC 异常

     

    Spring之 JDBC 异常

     

    需要资料请关注我哦,加我的交流群772300343获取!

    我是小架,感谢大家一直以来的关注!

    我们下篇文章见!

  • 相关阅读:
    ##3.Keystone 验证服务--openstack
    gitlab一键安装+配置(备份+LADP认证)
    【hexo】03config文件配置详解
    【hexo】01安装
    第6章 linux的文件权限与目录配置
    ubuntu14.04安装Anaconda
    ubuntu14.04安装opencv-python
    ubuntu14.04配置face_recognition环境
    php7 安装时需求的依赖包
    删除包的时候因为依赖关系导致失败的解决方法
  • 原文地址:https://www.cnblogs.com/sevencutekk/p/11580296.html
Copyright © 2020-2023  润新知