Spring Boot 2.5 終于對數(shù)據(jù)源動刀了!

數(shù)據(jù)源升級
最近有看過《Spring Boot 2.5 重磅發(fā)布》一文的朋友應(yīng)該都知道,Spring Boot 2.5 有一個數(shù)據(jù)源的重大變動,那就是某些數(shù)據(jù)源初始化的方法被重新設(shè)計(jì)了,下面的數(shù)據(jù)源參數(shù)配置也被廢除了:
spring.datasource.*
新的數(shù)據(jù)源參數(shù)配置如下:
spring.sql.init.*
今天把項(xiàng)目升級到了 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
以為會很順利,啟動居然報(bào)錯:

數(shù)據(jù)源參數(shù)不是被重命名了嗎,咋不行。。。
看來新的數(shù)據(jù)源參數(shù)并沒有被識別,于是抱著懷疑的態(tài)度看了下 Spring Boot 2.5 數(shù)據(jù)源參數(shù)綁定類 DataSourceProperties 的源碼:

數(shù)據(jù)源參數(shù)綁定前綴依然還是:spring.datasource!!!
咦……怎么和我原先理解的不太一樣,有鬼了。。
再注意看上圖左邊部分,有 4 個類被標(biāo)識廢除了,然后我再全局搜索了下新的參數(shù) spring.sql.init 在源碼中使用到的地方:

可以看到一些數(shù)據(jù)源參數(shù)被拿到 SqlInitializationProperties 類去了。

從廢除的幾個類,再到新參數(shù)使用到的幾個新類,它們都指向的是初始化 SQL 數(shù)據(jù)庫(比如:新建一張表、初始化表數(shù)據(jù)),而不是初始化數(shù)據(jù)源(和數(shù)據(jù)庫建立連接池),這是兩個概念,前者需要依賴后者完成。。
WC,差點(diǎn)被帶溝里了……
初始化 SQL 數(shù)據(jù)庫
好吧,既然清楚了,我們再來驗(yàn)證下新的 SQL 數(shù)據(jù)庫初始化機(jī)制,看看理解是否有錯。
下面直接說重點(diǎn),Spring Boot 基礎(chǔ)框架就就不介紹了,不清楚的可以關(guān)注公眾號:Java技術(shù)棧,在后臺回復(fù):boot,我寫的一堆實(shí)戰(zhàn)教程都整理好了。
添加數(shù)據(jù)源和 SQL 初始化參數(shù):
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.*,更多初始化參數(shù)請參考這個類:
org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties
新建對應(yīng)的創(chuàng)建表 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` )
);
新建對應(yīng)的初始化表數(shù)據(jù) SQL 文件:
sql/insert_t_javastack.sql
insert into t_javastack(title, content) values
('標(biāo)題1', '內(nèi)容1'),
('標(biāo)題2', '內(nèi)容2'),
('標(biāo)題3', '內(nèi)容3'),
('標(biāo)題4', '內(nèi)容4'),
('標(biāo)題5', '內(nèi)容5');
OK,啟動正常,再來驗(yàn)證下表是否創(chuàng)建,數(shù)據(jù)是否插入:
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 | 標(biāo)題1 | 內(nèi)容1 |
| 2 | 標(biāo)題2 | 內(nèi)容2 |
| 3 | 標(biāo)題3 | 內(nèi)容3 |
| 4 | 標(biāo)題4 | 內(nèi)容4 |
| 5 | 標(biāo)題5 | 內(nèi)容5 |
+----+---------+---------+
5 rows in set (0.00 sec)
現(xiàn)在終于和我理解的一致了,你理解了嗎?
這個功能可能在單元測試的時候有用到,生產(chǎn)環(huán)境是不太可能會用到的。
總結(jié)
Spring Boot 2.5 中的 spring.sql.init.* 是初始化 SQL 數(shù)據(jù)庫使用的新參數(shù)前綴,不再使用前綴 spring.datasource.* 了,后續(xù)版本會進(jìn)行移除,其實(shí)就是 DDL/DML 配置和數(shù)據(jù)源連接配置分家了。
新的參數(shù)確實(shí)也更清楚明朗了,小伙伴們有用到 SQL 數(shù)據(jù)庫初始化功能的,升級 Spring Boot 2.5 時可以注意一下。有時候理論看再多,還不如實(shí)踐一次,實(shí)踐出真理,你以為你理解對了,其實(shí)不然。
本文完整的的示例源碼已經(jīng)上傳:
https://github.com/javastacks/spring-boot-best-practice
大家可以 Star 學(xué)習(xí)一下,Spring Boot 2.5 我還在慢慢踩坑中,后面會形成更多實(shí)戰(zhàn)干貨文章,關(guān)注公眾號Java技術(shù)棧第一時間推送。
最后,大家覺得本文有用的話,動動小手,給棧長來個小小的在看、轉(zhuǎn)發(fā)唄,原創(chuàng)不易,需要你的鼓勵哦~
版權(quán)申明:本文系公眾號 "Java技術(shù)棧" 原創(chuàng),原創(chuàng)實(shí)屬不易,轉(zhuǎn)載、引用本文內(nèi)容請注明出處,禁止抄襲、洗稿,請自重,尊重大家的勞動成果和知識產(chǎn)權(quán),抄襲必究。
往 期 推 薦 1、Intellij IDEA這樣 配置注釋模板,讓你瞬間高出一個逼格! 2、吊炸天的 Docker 圖形化工具 Portainer,必須推薦給你! 3、最牛逼的 Java 日志框架,性能無敵,橫掃所有對手! 4、把Redis當(dāng)作隊(duì)列來用,真的合適嗎? 5、驚呆了,Spring Boot居然這么耗內(nèi)存!你知道嗎? 6、全網(wǎng)最全 Java 日志框架適配方案!還有誰不會? 7、Spring中毒太深,離開Spring我居然連最基本的接口都不會寫了 點(diǎn)分享
點(diǎn)收藏
點(diǎn)點(diǎn)贊
點(diǎn)在看






