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