【DB系列】数据库版本管理Liquibase集成

文章目录
  1. I. 项目搭建
    1. 1. 依赖
    2. 2. 配置
  2. II. 项目演示
    1. 1. 测试
    2. 2. 增量变更
    3. 3. 小结
  3. III. 不能错过的源码和相关知识点
    1. 0. 项目
    2. 1. 微信公众号: 一灰灰Blog

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

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

I. 项目搭建

1. 依赖

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 默认的数据库名
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

1
2
3
4
5
6
7
8
9
10
<?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 对应的内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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相关的表结构定义如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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对应的初始化数据定义如下

1
2
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. 测试

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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文件的引入

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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文件,内容如下

1
2
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或者有更好的建议,欢迎批评指正,不吝感激

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

一灰灰blog


打赏 如果觉得我的文章对您有帮助,请随意打赏。
分享到