1. 程式人生 > 實用技巧 >Springboot 2.x JDBC 配置

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、測試結果