Spring数据库异常抽理知识点分享

  • 时间:
  • 9585人关注

在本篇文章里小编给大家分享了关于源码解析Spring 数据库异常抽理知识点内容,对此有需要的朋友们学习参考下。,另外这篇文章主要知识点是关于Spring、数据库、异常抽理、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子资料:

数据库为:H2

源码解析Spring 数据库异常抽理知识点总结

如果需要处理特定 SQL 异常,比如 SQL 语句错误,这个时候我们应该怎么办?

查看 SQLException 源码,我们可以发现两个重要的方法。

SQLException.getErrorCode:返回数据库特定的错误码,由数据库厂商制定,不同厂商错误码不同。如重复主键错误码在 MySQL 中是 1062,而在 Oracle 中却是 1。

SQLException.getSQLState:返回 XOPEN 或 SQL:2003 制定的错误码规范。数据库厂商会将不同错误消息映射成同一个错误码

所以我们可以根据 SQLException.getErrorCode 处理相应的数据库异常。

源码解析Spring 数据库异常抽理知识点总结

由于数据库厂商错误码不相同,这就导致如果我们更换数据库,上面判断逻辑就必须重写。

下面我们使用 Spring 操作数据库。

Spring 操作数据库

源码解析Spring 数据库异常抽理知识点总结

使用 Spring 之后,我们不再需要强制捕获异常。如果 SQL 语句运行存在异常,Spring 会抛出其内置特定的异常。如上面 SQL 语句异常将会抛出 BadSqlGrammarException。除了这个异常之外,Spring 还定义很多数据库异常。

源码解析Spring 数据库异常抽理知识点总结

每个 Spring 数据库异常的基类都是 DataAccessException。由于 DataAccessException 继承自 RuntimeException,所以在这类异常无需强制捕获。

在 Spring 中使用 SQLExceptionTranslator 进行异常转换,默认的转换规则会根据 SQLException.getErrorCode 返回的错误码进行相应的转换。

下面我们从源码分析转换过程。

实现细节

调试 JdbcTemplate 的源码。

源码解析Spring 数据库异常抽理知识点总结

可以看到这里捕获了 SQLException,转换之后再将其抛出。

整个转换过程,最后交给 SQLExceptionTranslator 进行转换。

首先我们查看 SQLExceptionTranslator 类图。

源码解析Spring 数据库异常抽理知识点总结

可以看到其实现了一个抽象类以及三个子类。

源码解析Spring 数据库异常抽理知识点总结

抽象类中会首先会使用子类转换,若未能转换成功,将会启动 fallback机制,再次转换,作为兜底。

接着我们先看下三个子类的区别。

SQLErrorCodeSQLExceptionTranslator:

默认转换类主要根据 SQLException.getErrorCode 进行转换。默认使用 SQLExceptionSubclassTranslator 作为 fallback 对象。

SQLExceptionSubclassTranslator:

基于 JDBC 的 SQLException 标准子类判断,如 java.sql.SQLTransientException。使用 SQLStateSQLExceptionTranslator 作为 fallback 对象。

SQLStateSQLExceptionTranslator:

基于 SQLException.getSQLState 规则判断。

下面分析 SQLErrorCodeSQLExceptionTranslator ,其他两个比较类似,同学们可以自己看源码分析。

SQLErrorCodeSQLExceptionTranslator 转换器主要根据 SQLException.getErrorCode 进行判断。Spring 默认在 org/springframework/jdbc/support/sql-error-codes.xml 归纳不同数据库厂商相关错误码。该配置文件会在第一次发生 SQL 异常时由 SQLErrorCodesFactory 进行加载,最后生成 SQLErrorCodes。

源码解析Spring 数据库异常抽理知识点总结

另外在 SQLErrorCodes 提供扩展方法,可以根据错误码转换成自定义的异常。

最后查看 SQLErrorCodeSQLExceptionTranslator 里的转换方法。

源码解析Spring 数据库异常抽理知识点总结

前三个方法是 Spring 留下扩展方法,可以根据自己需求分别扩展。若都没有实现,将会根据错误码判断转换成具体的异常。

源码解析Spring 数据库异常抽理知识点总结

自定义异常转换

上面说到 Spring 总共给我们留下三处扩展点。

继承 SQLErrorCodeSQLExceptionTranslator,重写 customTranslate。继承 SQLExceptionTranslator,重写 translate,然后在 sql-error-codes.xml注入。使用 SQLErrorCodes#customTranslations ,然后在 sql-error-codes.xml 配置相关错误码转换的规则。

第三种方式改动最小,比较简单。首先在 classpath 下生成 sql-error-codes.xml,复制原有配置,最后配置 customTranslations 。

源码解析Spring 数据库异常抽理知识点总结

这里需要注意的是,需要转化的异常类型必须为 DataAccessException 子类。下面面我们自定义一个异常。

源码解析Spring 数据库异常抽理知识点总结

总结

Spirng 异常处理将 SQL 异常转化成内置异常,屏蔽不同数据库返回码不一致的带来的问题。

最后总结本文的知识点,希望帮助到大家。

源码解析Spring 数据库异常抽理知识点总结

帮助

Handling SQLExceptions


上一篇:eclipse创建java项目的方法详解

下一篇:java导出Excel的实例功能详解

相关内容

  • 数据库可以转java吗

    数据库开发也是不错的岗位,可以往DBA工程师、数据库工程师方向发展也可以往大数内据方向发展。当然多学一门JAVA语言也是有好处的,毕竟现在JAVA比较流行,像搞大数据、服务器端开发等都需要这方面的技能。如果自学能力比较有限,建议还是参加培训班更快些。JAVA可以说是特别热门的的编程语言,对于很多高级语言来说,JAVA都是基础;另外一个,JAVA是跨平台专的,有多个属方面的应用,如Android、Swing、J2EE、J2ME等。就业面比较广,市场用人需求也

    11-21数据库能转java吗

    阅读更多
  • java语言可以创建数据库吗

    java语言可以创建数据库,分两种情况,一种是服务器型的数据库,另一种情况是没有服务器的数据库。 1、 一种是服务器型的数据库, 通过语句建立库, 我试过的MySQL就可以, JDBC链接上MYSQL后, 用Statement 执行建表的SQL语句, 提交的时候一定要用execute(String)来提交, 因为executeUpdate不一定可以执行建表语句.其他数据库应该也可以, 因为你想, 既然比如Oracle 之类的数据库有第三方图形化软件, 可以进行全面的操作, 包括申请表空间, 建库等等, 那

    11-19java语言能创建数据库吗

    阅读更多
  • Springboot停止服务的方法总结

    这篇文章主要介绍了详解Springboot 优雅停止服务的几种方法 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    11-21详解Springboot优雅停止服务的几种方法

    阅读更多
  • Spring Cloud Stream异常处理过程讲解

    这篇文章主要介绍了Spring Cloud Stream异常处理过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    03-25Spring Cloud Stream异常处理过程解析

    阅读更多
  • Springboot+redis+Interceptor+自定义annotation实现接口自动幂等

    本篇文章给大家介绍了使用springboot和拦截器、redis来优雅的实现接口幂等,对于幂等在实际的开发过程中是十分重要的,因为一个接口可能会被无数的客户端调用,如何保证其不影响后台的业务

    04-26接口自动幂实现方法

    阅读更多
  • Spring Data JPA从入门到精通

    Spring Data JPA从入门到精通

    真正的从入门到精通,结合案例与工程实践,深入浅出,完整介绍Spring Data JPA,既是开发手册,又是实战指南,从整体到局部,深刻认识Spring Data JPA

    大小:84.93 MBSpring

    点击下载
  • Spring Boot 2精髓:从构建小系统到架构分布式大系统

    Spring Boot 2精髓:从构建小系统到架构分布式大系统

    这本书系统介绍了Spring Boot 2的主要技术,涵盖Spring Boot框架、Spring MVC、视图技术、数据库访问技术,并且介绍多环境部署、自动装配、单元测试等高级特性,介绍如何平滑地用Spring Boot实现分布式架构等

    大小:174.8 MBSpringBoot

    点击下载
  • 微服务实战(Dubbox+Spring Boot+Docker)

    微服务实战(Dubbox+Spring Boot+Docker)

    在这个凡事皆互联的时代,越来越多的人和物成为互联网上的节点,不断扩充着互联网这张大网的边界。节点即价值,更多的节点意味着更大的价值。

    大小:90.8 MB微服务

    点击下载
  • Spring Boot+Vue全栈开发实战

    Spring Boot+Vue全栈开发实战

    传统的JavaEE开发效率低下、配置臃肿、调试不便,严重制约了程序员的生产力。Spring Boot致力于简化开发配置,并为企业级开发提供一系列非业务性功能;而Vue则采用数据驱动视图的方式将程序

    大小:196.3 MBSpring

    点击下载
  • 疯狂Spring Cloud微服务架构实战

    疯狂Spring Cloud微服务架构实战

    《疯狂Spring Cloud微服务架构实战》以Spring Cloud为基础,深入讲解微服务开发的相关框架,包括服务管理框架Eureka、负载均衡框架Ribbon、服务客户端Feign、容错框架Hystrix、消息框架Stream等。

    大小:176.9 MB微服务

    点击下载
  • 一步一步学Spring Boot 2

    一步一步学Spring Boot 2

    本书主要内容包括Spring Boot环境搭建、Spring Boot常用标签、Spring Boot集成Redis、数据库MySQL、Spring Data、日志Log4J、Thymeleaf模板引擎、ActiveMQ消息、MyBatis等流行技术,以及利用Spring Boot实现邮件发送、Quartz定时器、过滤器Filter和监听器Listener等。

    大小:72.04 MBSpring Boot

    点击下载

学习笔记