SpringBoot系列之数据库版本管理Liquibase集成


前面几篇介绍了项目启动之后进行数据库初始化的几种方式,接下来我们看一下如何使用Liquibase来实现数据库版本管理

SpringBoot内置了对Liquibase的支持,在项目中使用非常简单

I. 项目搭建

1. 依赖

首先搭建一个标准的SpringBoot项目工程,相关版本以及依赖如下

本项目借助SpringBoot 2.2.1.RELEASE + maven 3.5.3 + IDEA进行开发

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
        <version>3.8.0</version>
    </dependency>
</dependencies>

本文使用MySql数据库, 版本8.0.31; Liquibase的核心依赖liquibase-core,版本推荐使用SpringBoot配套的版本,一般来讲无需特殊指定

2. 配置

配置文件 resources/application.yml

# 默认的数据库名
database:
  name: tt

spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/${database.name}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password:
  liquibase:
    change-log: classpath:liquibase/master.xml
    enabled: true

logging:
  level:
    root: info
    org:
      springframework:
        jdbc:
          core: debug

关键配置为 spring.liquibase.change-logspring.liquibase.enabled

第一个指定的是change-log对应的xml文件,其内容如下

liquibase核心xml文件 resources/liquibase/master.xml

<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
    http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">

    <include file="liquibase/changelog/000_initial_schema.xml" relativeToChangelogFile="false"/>

</databaseChangeLog>

上面的xml依赖了一个xml文件,如第一个主要定义的是初始化的表结构

resources/changelog/000_initial_schema.xml 对应的内容如下

<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">

    <property name="now" value="now()" dbms="mysql"/>
    <property name="autoIncrement" value="true"/>

    <changeSet id="00000000000001" author="YiHui">
        <sqlFile dbms="mysql" endDelimiter=";" encoding="UTF-8" path="liquibase/data/init_schema_221209.sql"/>
    </changeSet>

    <changeSet id="00000000000002" author="YiHui">
        <sqlFile dbms="mysql" endDelimiter=";" encoding="UTF-8" path="liquibase/data/init_data_221209.sql"/>
    </changeSet>
</databaseChangeLog>

在上面的配置文件中,核心点在 <changeSet> 其中id要求全局唯一,sqlFile表示这次变动对应的sql语句; 一个<changeSet>对应一次变更,注意每次变更完成之后,不能再修改(sql文件内容不能改),changeSet本身也不要再去修改

接下来再看一下对应的sql文件

resources/liquibase/data/init_schema_221209.sql对应的schema相关的表结构定义如下

CREATE TABLE `user`
(
    `id`               int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `third_account_id` varchar(128) NOT NULL DEFAULT '' COMMENT '第三方用户ID',
    `user_name`        varchar(64)  NOT NULL DEFAULT '' COMMENT '用户名',
    `password`         varchar(128) NOT NULL DEFAULT '' COMMENT '密码',
    `login_type`       tinyint      NOT NULL DEFAULT '0' COMMENT '登录方式: 0-微信登录,1-账号密码登录',
    `deleted`          tinyint      NOT NULL DEFAULT '0' COMMENT '是否删除',
    `create_time`      timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time`      timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
    PRIMARY KEY (`id`),
    KEY                `key_third_account_id` (`third_account_id`),
    KEY                `user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4  COMMENT='用户登录表';

resources/liquibase/data/init_data_221209.sql对应的初始化数据定义如下

INSERT INTO `user` (id, third_account_id, `user_name`, `password`, login_type, deleted)
VALUES (1, 'a7cb7228-0f85-4dd5-845c-7c5df3746e92', 'admin', 'admin', 0, 0);

II. 项目演示

1. 测试

上面配置完毕之后,再主项目结构工程中无需特殊处理,我们写一个简单的启动测试一下

@Slf4j
@SpringBootApplication
public class Application implements ApplicationRunner {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        List list = jdbcTemplate.queryForList("select * from user limit 2");
        log.info("项目启动成功,初始化数据: {}", list);
    }
}

直接执行之后看一下输出结果(再执行之前,请确保数据库已经创建成功了;若没有则会抛异常)

2. 增量变更

上面演示的是初始化过程;再实际开发过程中,若存在增量的变更,比如现在需要新增一个测试数据,此时我们的操作流程可以如下

liquibase/目录下新增一个001_change_schema.xml文件,后续的增量变更相关的ChangeSet都放在这个xml文件中;再master.xml文件中,添加上面xml文件的引入

    <include file="liquibase/changelog/001_change_schema.xml" relativeToChangelogFile="false"/>

其次就是 resources/liquibase/changelog/001_change_schema.xml 文件内容

<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">

    <property name="now" value="now()" dbms="mysql"/>
    <property name="autoIncrement" value="true"/>

    <!-- 后续出现新的变更时,每一个变更都新增一个对应的 changeSet  -->
    <changeSet id="00000000000003" author="YiHui">
        <sqlFile dbms="mysql" endDelimiter=";" encoding="UTF-8" path="liquibase/data/init_data_221212.sql"/>
    </changeSet>
</databaseChangeLog>

上面的changeSet中包含初始化相关的sql文件,内容如下

INSERT INTO `user` (id, third_account_id, `user_name`, `password`, login_type, deleted)
VALUES (2, 'a7cb7228-0f85-4dd5-845c-11123123', 'new', 'new', 0, 0);

再次启动验证一下,是否增加了新的数据

3. 小结

本文主要介绍的是SpringBoot如何结合Liquibase来实现数据库版本管理,核心知识点介绍得不多,再实际使用的时候,重点注意

每次变更,都新增一个 <changeSet>,且保证所有的id唯一;当变更完成之后,不要再修改对应sql文件内容

liquibase本身也有一些相关的知识点,如版本回滚,标签语义等,下篇博文再专门介绍Liquibase本身的核心知识点

如对项目启动之后数据初始话相关有兴趣的小伙伴,欢迎查看

III. 不能错过的源码和相关知识点

0. 项目

1. 微信公众号: 一灰灰Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一灰灰blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值