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
以为会很顺利,启动居然报错:
![](https://filescdn.proginn.com/eb0e48cd239ac2d32481bb3bf11784dc/00d45ff46953bebe62a79870295471cb.webp)
数据源参数不是被重命名了吗,咋不行。。。
看来新的数据源参数并没有被识别,于是抱着怀疑的态度看了下 Spring Boot 2.5 数据源参数绑定类 DataSourceProperties 的源码:
![](https://filescdn.proginn.com/19ec84d3ac3192aba8f75dfadafa09d1/ac5cc1c5ed227a3e106f2e992f4e2eef.webp)
数据源参数绑定前缀依然还是:spring.datasource!!!
咦……怎么和我原先理解的不太一样,有鬼了。。
再注意看上图左边部分,有 4 个类被标识废除了,然后我再全局搜索了下新的参数 spring.sql.init 在源码中使用到的地方:
![](https://filescdn.proginn.com/92e52213fa0b46e604f9094180cc96e1/01b8ffb7edbddcc435c447cecaaf4960.webp)
可以看到一些数据源参数被拿到 SqlInitializationProperties 类去了。
![](https://filescdn.proginn.com/cc63ae22082fe6b0cbf3865bd42ab77a/da5c630e7c29aafab8ffc9c73924f7b1.webp)
从废除的几个类,再到新参数使用到的几个新类,它们都指向的是初始化 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、Intellij IDEA这样 配置注释模板,让你瞬间高出一个逼格! 2、吊炸天的 Docker 图形化工具 Portainer,必须推荐给你! 3、最牛逼的 Java 日志框架,性能无敌,横扫所有对手! 4、把Redis当作队列来用,真的合适吗? 5、惊呆了,Spring Boot居然这么耗内存!你知道吗? 6、全网最全 Java 日志框架适配方案!还有谁不会? 7、Spring中毒太深,离开Spring我居然连最基本的接口都不会写了 点分享
点收藏
点点赞
点在看