Spring Boot 2.5 终于对数据源动刀了!

Java技术迷

共 5007字,需浏览 11分钟

 ·

2021-06-12 11:30



数据源升级

最近有看过《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、Intellij IDEA这样 配置注释模板,让你瞬间高出一个逼格!
2、吊炸天的 Docker 图形化工具 Portainer,必须推荐给你!
3、最牛逼的 Java 日志框架,性能无敌,横扫所有对手!
4、把Redis当作队列来用,真的合适吗?
5、惊呆了,Spring Boot居然这么耗内存!你知道吗?
6、全网最全 Java 日志框架适配方案!还有谁不会?
7、Spring中毒太深,离开Spring我居然连最基本的接口都不会写了

点分享

点收藏

点点赞

点在看

浏览 29
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报