写作时间:2019-08-18
Spring Boot: 2.1 ,JDK: 1.8, IDE: IntelliJ IDEA

说明

一致异常层级结构(Consistent Exception Hierarchy):
Spring提供了以DataAccessException为异常基类。所有的数据库操作异常信息都会包括在异常基类中,不用担心异常信息的丢失.

DataAccessException继承图解

Spring怎么认识错误码的

通过SQLErrorCodeSQLExceptionTranslator解析错误码

ErrorCode 定义

  1. org/springframework/jdbc/support/sql-error-codes.xml
  2. Classpath 下的 sql-error-codes.xml

SQLErrorCodes 源码位置

SQLErrorCodes 源码位置
org.springframework.jdbc.support.SQLErrorCodes

public class SQLErrorCodes {@Nullableprivate 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];@Nullableprivate CustomSQLErrorCodesTranslation[] customTranslations;@Nullableprivate SQLExceptionTranslator customSqlExceptionTranslator;...
}

注释:

  1. databaseProductNames 数据库名字
  2. badSqlGrammarCodes 语法错误码
  3. duplicateKeyCodes 重复主键

错误码配置信息
org.springframework.jdbc.support.sql-error-codes.xml

<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>

注释:上面展示了H2的配置信息

工程建立

参照教程【SpringBoot 2.1 | 第一篇:构建第一个SpringBoot工程】新建一个Spring Boot项目,名字叫demodberrorcode, 在目录src/main/java/resources 下找到配置文件application.properties,重命名为application.yml

在Dependency中选择
Developer Tools > Lombok
Web > Spring Web Starter
SQL > H2 DataBase / JDBC API
Ops > Spring Boot Actuator。

设置日志打印格式化ANSI

ANSI - American National Standards Institute
Support classes to provide ANSI color output.

src > main > resources > application.yml

spring:output:ansi:enabled: always

创建表Foo

路径 src > main > resources > schema.sql

CREATE TABLE FOO (ID INT IDENTITY, BAR VARCHAR(64));

自定义异常类

com.zgpeace.demodberrorcode.CustomDuplicatedKeyException

package com.zgpeace.demodberrorcode;import org.springframework.dao.DuplicateKeyException;public class CustomDuplicatedKeyException extends DuplicateKeyException {public CustomDuplicatedKeyException(String msg) {super(msg);}public CustomDuplicatedKeyException(String msg, Throwable cause) {super(msg, cause);}
}

自定义错误码配置

路径 src > main > resources > sql-error-codes.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd"><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><property name="customTranslations"><bean class="org.springframework.jdbc.support.CustomSQLErrorCodesTranslation"><property name="errorCodes" value="23001,23505"/><property name="exceptionClass"value="com.zgpeace.demodberrorcode.CustomDuplicatedKeyException"/></bean></property></bean></beans>

Controller UnitTesst

com.zgpeace.demodberrorcode.DemodberrorcodeApplicationTests

package com.zgpeace.demodberrorcode;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
public class DemodberrorcodeApplicationTests {@Autowiredprivate JdbcTemplate jdbcTemplate;@Test(expected = CustomDuplicatedKeyException.class)public void testThrowingCustomException() {jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'A')");jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'B')");}@Testpublic void testThrowingException() {jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'A')");jdbcTemplate.execute("INSERT INTO FOO (ID, BAR) VALUES (1, 'B')");}}

注释:

  1. 方法testThrowingCustomException()运行通过,因为自定义异常,没有处理重复主键的问题。
  2. 方法testThrowingException() 报重复主键异常
com.zgpeace.demodberrorcode.CustomDuplicatedKeyException:
StatementCallback: Unique index or primary key violation:
"PRIMARY KEY ON PUBLIC.FOO(ID) [1, 'A']"; SQL statement:
INSERT INTO FOO (ID, BAR) VALUES (1, 'B') [23505-199];
nested exception is org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:
Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.FOO(ID) [1, 'A']"; SQL statement:
INSERT INTO FOO (ID, BAR) VALUES (1, 'B') [23505-199]

总结

恭喜你,学会了SpringBoot的JDBC异常自定义错误码处理。
代码下载:

https://github.com/zgpeace/Spring-Boot2.1/tree/master/db/demodberrorcode

参考

https://docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html#dao

https://github.com/geektime-geekbang/geektime-spring-family/tree/master/Chapter%202/errorcode-demo

易筋SpringBoot 2.1 | 第十八篇:SpringBoot的JDBC异常相关推荐

  1. 2021年安全生产工作总结及2022年思路计划(二十八篇)PPTX(附下载)

    摘要:2021年安全生产工作总结及2022年思路计划(二十八篇) 公众号:安全生产星球

  2. 实习日志_实习律师实习日志第十八篇(连载30篇)

    提供实习律师实习日记相关的文章资讯,希望我的分享能让您感到满意! 这个月接触最多的是人身损害赔偿的一些案件,交通事故.工伤的一些案件最多.起初,以为这些案件就是走走法律流程便可了事,最简单不过,可当完 ...

  3. SpringBoot第十八篇: 定时任务(Scheduling Tasks)

    这篇文章将介绍怎么通过spring去做调度任务. 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务. @SpringBootApplica ...

  4. 第六十八篇:从ADAS到自动驾驶(一):自动驾驶发展及分级

    作者:liaojiacai     邮箱: ljc_v2x_adas@foxmail.com 从ADAS到自动驾驶(一):自动驾驶的发展及分级 从今天起,我将根据自己所接触的ADAS和无人驾驶技术,来 ...

  5. SpringBoot非官方教程 | 第二十六篇: sprinboot整合elk,搭建实时日志平台

    转载请标明出处: 原文首发于https://www.fangzhipeng.com/springboot/2017/07/11/sprinboot25-elk/ 本文出自方志朋的博客 这篇文章主要介绍 ...

  6. “约见”面试官系列之常见面试题之第八十八篇之什么是vue生命周期(建议收藏)

    我们知道vue是一个构建数据驱动的 web 界面的渐进式框架,那么vue生命周期是什么呢?本篇文章就给大家来介绍一下vue生命周期的内容,希望可以帮助到有需要的朋友. vue生命周期是什么? Vue生 ...

  7. 第十八篇,Simulink with Git

    一.综述 本篇以MATLAB R2021b为基础讲解如何对Simulink模型做Git管理,mdl与slx均可. Git并非只能对手写代码做版本管理,它的应用十分广泛,囊括了各种使用编程语言编写的代码 ...

  8. 第十八篇:Question Answering问答系统

    目录 介绍 事实问题 非事实问题 为什么我们关注 NLP 中的事实问题? 2 种关键方法 大纲 IR-based QA 基于 IR 的 事实(Factoid) QA:TREC-QA 问题处理 答案类型 ...

  9. 七十八、SpringBoot监听rabbitmq和创建交换器,队列

    @Author:Runsen 来源:尚硅谷 下面建议读者学习尚硅谷的B站的SpringBoot视频,我是学雷丰阳视频入门的. 具体链接如下:B站尚硅谷SpringBoot教程 文章目录 AmqpAdm ...

  10. WPF效果第一百七十八篇ItemsControl旋转

    在前面分享的几篇中咱已经玩耍了Popup.ListBox多选.Grid动态分.RadioButton模板.控件的拖放效果.控件的置顶和置底.控件的锁定.自定义Window样式.动画效果.Expande ...

最新文章

  1. MAX2606调频发射芯片
  2. SUBMIT 的使用方法
  3. Linux监控   Nagios
  4. [原]详解如何将cocos2dx项目编译到Android平台上的(方式一:Cywin+NDK)
  5. oracle group by sql,Oracle SQL GROUP BY“不是GROUP BY表达式”的帮助
  6. ubuntu安装scala开发环境
  7. 问题 | kali2019.04版中文语言安装后就会乱码
  8. 编写python代码估算sin(x)的值
  9. 鸟哥的Linux私房菜-合集
  10. TouchPanel--ESD_Check
  11. Zune软件教程 Windows Phone同步攻略
  12. oracle8ora-00059,ORA-00059错误分析以及MAXDATAFILES、DB_FILES参数修改
  13. {转载}与我十年长跑的女朋友就要嫁人了。
  14. Laravel框架中使用 Repository 模式
  15. 关于excel导出日期格式变化问题处理
  16. Python创建文件夹和子文件夹
  17. 房天下二手交易平台房源数据采集
  18. Educoder中题目:泰坦尼克生还预测——可视化与探索性数据分析
  19. Tiny RTC DS1307 时钟模块 完整代码(Arduino)及一些要注意的地方
  20. 学习STM32单片机之结构体思想

热门文章

  1. windows redis 设置密码_Linux下设置redis访问密码
  2. 重置浏览器的css,css重置浏览器默认样式
  3. 大型架构.net平台篇(WEB层均衡负载nginx)
  4. 基于共享内存和多重哈希实现分布式缓存系统
  5. SQL 个人所学目录
  6. 11-linux基础八-正则表达式
  7. Duilib中Webbrowser事件完善使其支持判断页面加载完毕
  8. 没有权限角色管理功能菜单加载
  9. css background背景拉伸
  10. 摩游世纪CEO宋啸飞:Html5增长趋势已可见