Springboot 2.x 整合 JDBC
一、创建项目
使用 Spring Initializr 快速创建项目,选中如下模块(当然也可以手动导入依赖)
等待 IDEA 下载相关组件,下载完成后打开 pom.xml ,具体的依赖如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
// 这里数据库的驱动必须要和自己安装的数据库版本一致
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
其实 Springboot 已经为我们仲裁好了数据库驱动的版本,我们可以找到该项目的父项目 spring-boot-starter-parent ,然后找到 spring-boot-starter-parent 的父项目 spring-boot-dependencies ,在这里定义了 Springboot 为我们仲裁好的数据库驱动版本
而我本地 mysql 的版本为 8.0.20 ,如何将 Springboot 默认的 8.0.22 改为 8.0.20 呢?
方式一、pom.xml 定义 mysql.version 的版本
<properties>
<java.version>1.8</java.version>
// properties 中定义 mysql 的版本,覆盖 spring-boot-dependencies 中定义的 mysql.version
<mysql.version>8.0.20</mysql.version>
</properties>
方式二、pom.xml 直接定义 mysql 的版本
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
// 显示指定数据库驱动的版本,覆盖 spring-boot-dependencies 中定义的版本
<version>8.0.20</version>
<scope>runtime</scope>
</dependency>
二、Springboot JDBC 配置原理
Springboot 已经帮我们配置好了 JDBC,从我们引入的 starter 名称就可以看出来,官方整合的 starter 名称都是以 spring-boot-starter 开头的,而第三方的 starter 命名遵循的规则如下:
thirdpartyproject-spring-boot-starter
既然是官方配置好的,按照逻辑我们应该去 Springboot 的自动配置包中查看 Springboot 对 JDBC 是如何自动配置的
找到 jdbc 模块
我们这里就以数据源的配置为例
打开 DataSourceProperties
可以发现,我们可以通过在 application.properties 中配置 spring.datasource.xxx 来指定数据源的配置
接着还有数据库池话技术,默认引入了下面这些数据源
点开 DataSourceConfiguration 这个类,里面有 HikariDataSource 数据源
Springboot 默认的数据源就是 HikariDataSource ,因为我们引入 spring-boot-starter-jdbc 依赖的时候就默认引入了 HikariDataSource 的依赖,所以上面的判断条件成立,向 IOC 容器中
注入了 HikariDataSource
当然还有其它的数据源,例如 tomcat 数据源,从下面的代码飘红就可以看出没有生效,因为没有引入 tomcat 数据源的依赖,判断条件不成立,所以就不会向 IOC 容器中注入 tomcat 数据源
从上面可以看出,我们只要引入相应的数据源,然后就可以通过 spring.datasource.type 来改变数据源的类型
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
三、最佳实践
3.1、查看默认的数据源和操作默认配置的 JdbcTemplate
3.1.1、application.properties
# 用户名
spring.datasource.username=root
# 密码
spring.datasource.password=root
# mysql 数据库 URL
spring.datasource.url=jdbc:mysql://localhost:3306/jdbcdemo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
# mysql 驱动 (mysql 8.x 版本的使用 com.mysql.cj.jdbc.Driver
# 5.x 版本的使用的是 com.mysql.jdbc.Driver
# 使用 spring.datasource.driver-class-name 也是一样的,点击这个属性,会跳到同一个位置
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
3.1.2、测试类
@SpringBootTest
class DatasourceApplicationTests {
// 默认配置了 HikariDataSource 数据源
@Autowired
DataSource dataSource;
// 默认配置了 JdbcTemplate
@Autowired
JdbcTemplate jt;
@Test
void contextLoads() {
System.out.println("默认的数据源是: " + dataSource.getClass());
System.out.println("默认配置了 JdbcTemplate: " + jt.getClass());
List<Map<String, Object>> maps = jt.queryForList("select * from user");
System.out.println(maps);
}
}
3.1.3、测试结果
3.2、将默认的 HikariDataSource 数据源更换为 tomcat 数据源
3.2.1、指定数据源的类型
# 用户名
spring.datasource.username=root
# 密码
spring.datasource.password=root
# mysql 数据库 URL
spring.datasource.url=jdbc:mysql://localhost:3306/jdbcdemo?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
# mysql 驱动 (mysql 8.x 版本的使用 com.mysql.cj.jdbc.Driver
# 5.x 版本的使用的是 com.mysql.jdbc.Driver
# 使用 spring.datasource.driver-class-name 也是一样的,点击这个属性,会跳到同一个位置
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
# 指定使用的数据源类型为 tomcat 数据源
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
3.2.2、排除 Springboot 默认的数据源 HikariCP (其实不排除也可以,因为已经通过 spring.datasource.type 指定了数据源的类型)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
3.2.3、引入 tomcat 数据源的依赖
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>9.0.33</version>
</dependency>
3.2.4、测试类
@SpringBootTest
class DatasourceApplicationTests {
// 更换为 tomcat 数据源
@Autowired
DataSource dataSource;
// 默认配置了 JdbcTemplate
@Autowired
JdbcTemplate jt;
@Test
void contextLoads() {
System.out.println("更换后数据源是: " + dataSource.getClass());
System.out.println("默认配置了: " + jt.getClass());
List<Map<String, Object>> maps = jt.queryForList("select * from user");
System.out.println(maps);
}
}
3.2.5、测试结果