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、测试结果

 

posted @ 2021-01-20 11:32  变体精灵  阅读(573)  评论(0编辑  收藏  举报