zoukankan      html  css  js  c++  java
  • 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
    

    以为会很顺利,启动居然报错:

    数据源参数不是被重命名了吗,咋不行。。。

    看来新的数据源参数并没有被识别,于是抱着怀疑的态度看了下 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开发手册(嵩山版)》最新发布,速速下载!

    觉得不错,别忘了随手点赞+转发哦!

  • 相关阅读:
    Python中使用pip安装库时提示:远程主机强迫关闭了一个现有的连接
    一个真正有能力的人
    一个程序员的自白(延迟满足)
    小规模团队如何“微服务”管理
    一个程序员的自白(无知之者)
    小型系统如何“微服务”开发
    TCP协议学习总结(下)
    TCP协议学习总结(中)
    TCP协议学习总结(上)
    一个程序员的自白(三十而立)
  • 原文地址:https://www.cnblogs.com/javastack/p/14863436.html
Copyright © 2011-2022 走看看