Java 数据持久化系列(四)Spring JDBC 使用总结
Spring JDBC 简介
Spring 的 JDBC 框架承担了资源管理和异常处理的工作,从而简化了底层 JDBC API 代码,让我们只需编写从数据库读写数据所需的代码。具体特性如下:
Spring 为读取和写入数据库的几乎所有错误提供了丰富的异常,且不与特定的持久化框架相关联(如下图)。异常都继承自的父类
DataAccessException
,是一个非受检异常,无需捕获,因为 Spring 认为触发异常的很多问题是不能在catch
代码块中修复,因此不强制开发人员编写catch
代码块。这把是否要捕获异常的权利留给了开发人员。Spring 将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板(template) 和 回调(callback)。模板管理过程中固定的部分(如事务控制、资源管理、异常处理),而回调处理自定义的数据访问代码(如 SQL 语句、绑定参数、整理结果集)。针对不同的持久化平台,Spring 提供了多个可选的模板:
依赖安装
要在 Spring 中使用 JDBC,需要依赖 spring-jdbc
。如果使用 Spring Boot 的话,可以直接导入起步依赖 spring-boot-starter-jdbc
:
1 | <!-- Spring JDBC 起步依赖 --> |
mvn dependency:tree
分析传递依赖如下:
1 | [INFO] +- mysql:mysql-connector-java:jar:8.0.13:compile |
可见,spring-boot-starter-jdbc
引入了如下传递依赖:
spring-boot-starter
spring-boot-autoconfigure
Spring Boot 自动配置类
spring-jdbc
Spring JDBC 核心库HikariCP
,Spring Boot 2 的默认数据库连接池- ……
配置解析
spring-boot-autoconfigure
依赖内含几个关键的配置类,提供了如下外部配置:
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
,用于自动配置嵌入式数据源 或 连接池数据源1
2
3
4
5
6spring:
datasource:
driver-class-name:
url:
username:
password:org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration
,用于自动配置 JNDI 数据源1
2
3spring:
datasource:
jndi-name:org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration
,用于自动配置分布式事务的数据源1
2
3
4
5spring:
datasource:
xa:
data-source-class-name:
properties:org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
,用于导入配置类:JdbcTemplateConfiguration
、NamedParameterJdbcTemplateConfiguration
1
2
3
4
5
6spring:
jdbc:
template:
fetch-size:
max-rows:
query-timeout:org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration
用于自动配置DataSourceTransactionManager
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
1
2
3
4spring:
transaction:
defaultTimeout:
rollbackOnCommitFailure:
使用 JDBC Template
配置数据源
为了让 JdbcTemplate
正常工作,只需要为其设置 DataSource
数据源即可。Spring Boot 下直接使用外部配置:
1 | spring: |
如果未使用 Spring Boot,Java Config 如下:
1 |
|
API 介绍
org.springframework.jdbc.core.JdbcOperations
是 Spring 封装 JDBC 操作的核心接口,提供的方法如下,基于索引参数进行 SQL 参数绑定。实现类为org.springframework.jdbc.core.JdbcTemplate
:1
2
3
4
5
6
7
8
9
10
11
12<T> T execute(...)
<T> List<T> query(String, RowMapper<T>, Object...) // 多列查询
Map<String, Object> queryForMap(String, Object...) // 单行多列查询
<T> T queryForObject(String, Class<T>, Object...) // 单行单列查询
<T> T queryForObject(String, RowMapper<T>, Object...) // 单行多列查询
<T> List<T> queryForList(String, Class<T>, Object...) // 多行单列查询
List<Map<String, Object>> queryForList(String, Object...) // 多行多列查询
SqlRowSet queryForRowSet(...)
int update(...) // 执行单个增删改
int[] batchUpdate(...) // 执行批量增删改
Map<String, Object> call(...) // 执行存储过程和函数
......org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations
接口支持将值以命名参数的形式绑定到 SQL,实现类为org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
,其底层使用的仍然是JdbcOperations
,是一个二次封装的 API,推荐使用。
如果使用 Spring Boot 的话,可以直接导入起步依赖 spring-boot-starter-jdbc
,会引入自动配置类 org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
,用于导入配置类:JdbcTemplateConfiguration
、NamedParameterJdbcTemplateConfiguration
,源码如下:
1 |
|
只要满足几个条件,该自动配置类就会生效:
- classpath 包含
DataSource
、JdbcTemplate
类 DataSource
bean 有且只有一个
JdbcOperations
依赖注入 JdbcTemplate
实现之后,使用如下:
1 | List<TestPO> testPOList = jdbcOperations.query( |
NamedParameterJdbcTemplate
使用 JdbcOperations
需要特别注意索引参数的正确顺序,如果在修改 SQL 时忘记修改参数顺序,将导致查询出错。因此更建议使用命名参数,按照名字来绑定值:
1 | Map<String, Object> cityParamMap = new HashMap<>(); |