差點帶溝里了
最近有看過《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開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/285552.html
標籤:Java
