标签分类
技术文章
当前位置:主页 > 计算机编程 > java > 源码解析Spring 数据库异常抽理知识点总结

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

  • 发布时间:
  • 作者:码农之家原创
  • 点击:101

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

这篇文章主要知识点是关于Spring,数据库,异常抽理,源码解析Spring 数据库异常抽理知识点总结,的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Spring Cloud微服务架构进阶
  • 类型:微服务大小:219.4 MB格式:PDF出版:机械工业出版社作者:朱荣鑫
立即下载

更多相关的学习资源可以参阅 程序设计电子书Java电子书、等栏目。

数据库为: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

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到spring+springmvc+mybatis整合注、 vue项目中使用md5加密以及、 解决axios.interceptors.respon、 等java文章进一步学习,感谢大家的阅读和支持。

上一篇:java对synchronized的优化知识点总结

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

展开 +

收起 -

学习笔记
网友NO.296078

Spring boot 使用JdbcTemplate访问数据库

SpringBoot 是为了简化 Spring 应用的创建、运行、调试、部署等一系列问题而诞生的产物, 自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖就可以轻易的搭建出一个 WEB 工程 Spring Framework 对数据库的操作在 JDBC 上面做了深层次的封装,通过 依赖注入 功能,可以将 DataSource 注册到 JdbcTemplate 之中,使我们可以轻易的完成对象关系映射,并有助于规避常见的错误,在 SpringBoot 中我们可以很轻松的使用它。 特点 速度快,对比其它的ORM框架而言,JDBC的方式无异于是最快的 配置简单, Spring 自家出品,几乎没有额外配置 学习成本低,毕竟 JDBC 是基础知识, JdbcTemplate 更像是一个 DBUtils 导入依赖 在 pom.xml 中添加对 JdbcTemplate 的依赖 !-- Spring JDBC 的依赖包,使用 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 将会自动获得HikariCP依赖 --dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId/dependency!-- MYSQL包 --dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId/dependency!-- 默认就内嵌了Tomcat 容器,如需要更换容器也极其简单--dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId/dependency 连接数据库 在 application.properties 中添加如下配置。值得注意……

网友NO.928231

通过Spring Boot配置动态数据源访问多个数据库的实现代码

之前写过一篇博客《Spring+Mybatis+Mysql搭建分布式数据库访问框架》描述如何通过Spring+Mybatis配置动态数据源访问多个数据库。但是之前的方案有一些限制(原博客中也描述了):只适用于数据库数量不多且固定的情况。针对数据库动态增加的情况无能为力。 下面讲的方案能支持数据库动态增删,数量不限。 数据库环境准备 下面一Mysql为例,先在本地建3个数据库用于测试。需要说明的是本方案不限数据库数量,支持不同的数据库部署在不同的服务器上。如图所示db_project_001、db_project_002、db_project_003。 搭建Java后台微服务项目 创建一个Spring Boot的maven项目: config:数据源配置管理类。 datasource:自己实现的数据源管理逻辑。 dbmgr:管理了项目编码与数据库IP、名称的映射关系(实际项目中这部分数据保存在redis缓存中,可动态增删)。 mapper:数据库访问接口。 model:映射模型。 rest:微服务对外发布的restful接口,这里用来测试。 application.yml:配置了数据库的JDBC参数。 详细的代码实现 1. 添加数据源配置 package com.elon.dds.config;import javax.sql.DataSource;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.annotation.MapperScan;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.autoconf……

网友NO.258120

Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL数据库的方法

之前介绍了一些Web层的例子,包括构建RESTful API、使用Thymeleaf模板引擎渲染Web视图,但是这些内容还不足以构建一个动态的应用。通常我们做App也好,做Web应用也好,都需要内容,而内容通常存储于各种类型的数据库,服务端在接收到访问请求之后需要访问数据库获取并处理成展现给用户使用的数据形式。 本文介绍在Spring Boot基础下配置数据源和通过 JdbcTemplate 编写数据访问的示例。 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式。 首先,为了连接数据库需要引入jdbc支持,在 build.gradle 中引入如下配置: compile "org.springframework.boot:spring-boot-starter-jdbc:$spring_boot_version" 连接数据源 以MySQL数据库为例,先引入MySQL连接的依赖包,在 build.gradle 中加入: compile "mysql:mysql-connector-java:$mysql_version" 完整 build.gradle group 'name.quanke.kotlin'version '1.0-SNAPSHOT'buildscript { ext.kotlin_version = '1.2.10' ext.spring_boot_version = '1.5.4.RELEASE' ext.springfox_swagger2_version = '2.7.0' ext.mysql_version = '5.1.21' repositories { mavenCentral() } dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath("org.springframework.boot:spring-boot-gradle-plugin:$spring_boot_version")// Kotlin整合SpringBoot的默认无参构造函数,默认把所有的类设置……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明