差點帶溝裏了
最近有看過《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 時可以注意一下。有時候理論看再多,還不如實踐一次,實踐出真理,你以爲你理解對了,其實不然。
本文完整的的示例源碼已經上傳:
大家可以 Star 學習一下,Spring Boot 2.5 我還在慢慢踩坑中,後面會形成更多實戰乾貨文章,關注公衆號Java技術棧第一時間推送。
最後,大家覺得本文有用的話,動動小手,給棧長來個小小的在看、轉發唄,原創不易,需要你的鼓勵哦~
版權申明:本文系公衆號 "Java技術棧" 原創,原創實屬不易,轉載、引用本文內容請註明出處,禁止抄襲、洗稿,請自重,尊重大家的勞動成果和知識產權,抄襲必究。
近期熱文推薦:
1.600+ 道 Java面試題及答案整理(2021最新版)
2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!
3.阿里 Mock 工具正式開源,幹掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式發佈,全新顛覆性版本!
覺得不錯,別忘了隨手點贊+轉發哦!