Spring Boot 2.5 終於對數據源動刀了!

差點帶溝裏了

最近有看過《Spring Boot 2.5 重磅發佈》一文的朋友應該都知道,Spring Boot 2.5 有一個數據源的重大變動,那就是某些數據源初始化的方法被重新設計了,下面的數據源參數配置也被廢除了:

spring.datasource.*

新的數據源參數配置如下:

spring.sql.init.*

今天把項目升級到了 Spring Boot 2.5,再順便把 spring.datasource 也換成了 spring.sql.init:

spring:
  sql.init:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/javastack
    username: root
    password: 12345678

以爲會很順利,啓動居然報錯:

數據源參數不是被重命名了嗎,咋不行。。。

看來新的數據源參數並沒有被識別,於是抱着懷疑的態度看了下 Spring Boot 2.5 數據源參數綁定類 DataSourceProperties 的源碼:

數據源參數綁定前綴依然還是:spring.datasource!!!

咦……怎麼和我原先理解的不太一樣,有鬼了。。

再注意看上圖左邊部分,有 4 個類被標識廢除了,然後我再全局搜索了下新的參數 spring.sql.init 在源碼中使用到的地方:

可以看到一些數據源參數被拿到 SqlInitializationProperties 類去了。

從廢除的幾個類,再到新參數使用到的幾個新類,它們都指向的是初始化 SQL 數據庫(比如:新建一張表、初始化表數據),而不是初始化數據源(和數據庫建立連接池),這是兩個概念,前者需要依賴後者完成。。

WC,差點被帶溝裏了……

初始化 SQL 數據庫

好吧,既然清楚了,我們再來驗證下新的 SQL 數據庫初始化機制,看看理解是否有錯。

下面直接說重點,Spring Boot 基礎框架就就不介紹了,不清楚的可以關注公衆號:Java技術棧,在後臺回覆:boot,我寫的一堆實戰教程都整理好了。

添加數據源和 SQL 初始化參數:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/javastack
    username: root
    password: 12345678
  sql.init:
    schemaLocations:
      - classpath:sql/create_t_javastack.sql
    dataLocations:
      - classpath:sql/insert_t_javastack.sql

注意上面的 sql.init.*,更多初始化參數請參考這個類:

org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties

新建對應的創建表 SQL 文件:

sql/create_t_javastack.sql

CREATE TABLE IF NOT EXISTS `t_javastack`(
    `id` INT AUTO_INCREMENT,
    `title` VARCHAR(50) NOT NULL,
    `content` VARCHAR(100) NOT NULL,
    PRIMARY KEY ( `id` )
);

新建對應的初始化表數據 SQL 文件:

sql/insert_t_javastack.sql

insert into t_javastack(title, content) values
('標題1', '內容1'),
('標題2', '內容2'),
('標題3', '內容3'),
('標題4', '內容4'),
('標題5', '內容5');

OK,啓動正常,再來驗證下表是否創建,數據是否插入:

mysql> desc t_javastack;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int          | NO   | PRI | NULL    | auto_increment |
| title   | varchar(50)  | NO   |     | NULL    |                |
| content | varchar(100) | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

mysql> select * from t_javastack;
+----+---------+---------+
| id | title   | content |
+----+---------+---------+
|  1 | 標題1   | 內容1   |
|  2 | 標題2   | 內容2   |
|  3 | 標題3   | 內容3   |
|  4 | 標題4   | 內容4   |
|  5 | 標題5   | 內容5   |
+----+---------+---------+
5 rows in set (0.00 sec)

現在終於和我理解的一致了,你理解了嗎?

這個功能可能在單元測試的時候有用到,生產環境是不太可能會用到的。

總結

Spring Boot 2.5 中的 spring.sql.init.* 是初始化 SQL 數據庫使用的新參數前綴,不再使用前綴 spring.datasource.* 了,後續版本會進行移除,其實就是 DDL/DML 配置和數據源連接配置分家了。

新的參數確實也更清楚明朗了,小夥伴們有用到 SQL 數據庫初始化功能的,升級 Spring Boot 2.5 時可以注意一下。有時候理論看再多,還不如實踐一次,實踐出真理,你以爲你理解對了,其實不然。

本文完整的的示例源碼已經上傳:

https://github.com/javastacks/spring-boot-best-practice

大家可以 Star 學習一下,Spring Boot 2.5 我還在慢慢踩坑中,後面會形成更多實戰乾貨文章,關注公衆號Java技術棧第一時間推送。

最後,大家覺得本文有用的話,動動小手,給棧長來個小小的在看、轉發唄,原創不易,需要你的鼓勵哦~

版權申明:本文系公衆號 "Java技術棧" 原創,原創實屬不易,轉載、引用本文內容請註明出處,禁止抄襲、洗稿,請自重,尊重大家的勞動成果和知識產權,抄襲必究。

近期熱文推薦:

1.600+ 道 Java面試題及答案整理(2021最新版)

2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!

3.阿里 Mock 工具正式開源,幹掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式發佈,全新顛覆性版本!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章