Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 345|回复: 0

Spring之 JDBC 异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-6-21 16:18:21 | 显示全部楼层 |阅读模式

    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获取!

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

    我们下篇文章见!

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-1 22:41 , Processed in 0.063728 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表