前面几篇介绍了项目启动之后进行数据库初始化的几种方式,接下来我们看一下如何使用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-log 和 spring.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 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或者有更好的建议,欢迎批评指正,不吝感激
下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

打赏
如果觉得我的文章对您有帮助,请随意打赏。
微信打赏
支付宝打赏