SpringBoot整合Liquibase
liquibase是什么?
数据库变更的版本控制工具
liquibase的基本概念
- changeSet 是执行sql并记录、版本控制的最小单元。即每条changeSet生成1条执行记录,版本控制是基于执行记录的。
- changelog 即执行记录。由changeSet执行后产生的记录。记录默认保存在databasechangelog表中,此表由liquibase自动生成。包含id,author,filename,dateexcuted,orderexcuted,exectype,md5sum等字段。
- databasechangeloglock。liquibase的锁表。liquibase在执行前更新此表的locked为true,执行完liquibase的工作,将locked更新为false,适合集群使用。
liquibase整合中的两种情况
-
在启动项目时自动执行脚本,若新添加了liquibase脚本需要重启项目才能执行脚本。
-
在不启动项目时也能通过插件或者指令让他手动执行脚本。
整合要么只整合1,要么1、2一起整合,只整合2项目启动会报liquibase相关bean的错误。
整合1
父项目pom中引入依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
<!--liquibase依赖-->
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.6.2</version>
</dependency>
主配置文件(application.properties)配置liquibase,url加上时区serverTimezone
#jdbc
#指定数据库驱动
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库jdbc连接url地址,serverTimezone设置数据库时区东八区
spring.datasource.url=jdbc:mysql://localhost:3306/testmybatisplus?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false
#数据库账号
spring.datasource.username=root
spring.datasource.password=123456
#liquibase配置
#enabled:true开启liquibase,默认开启
spring.liquibase.enabled=true
spring.liquibase.change-log=classpath:/liquibase/db.changelog-master.xml
然后配置db.changelog-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.8.xsd">
<!--relativeToChangelogFile="true"表示根据该changeLog的相对路径寻找changeLog文件-->
<include file="db.changelog-1.0.0.xml" relativeToChangelogFile="true"/>
<include file="db.changelog-2.0.0.xml" relativeToChangelogFile="true"/>
<include file="db.changelog-3.0.0.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
下面写一个changelog来试一试,注意文件存放位置,命名为db.changelog-1.0.0.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.8.xsd">
<changeSet id="2022-1-11" author="ABC">
<createTable tableName="resource_type">
<column name="type_id" type="varchar(40)" remarks="资源类型id">
<constraints primaryKey="true" />
</column>
<column name="parent_id" type="varchar(40)" remarks="父节点">
<constraints nullable="false" />
</column>
<column name="resource_key" type="varchar(40)" remarks="节点标识">
<constraints nullable="false" />
</column>
<column name="del_flag" type="tinyint(1)" remarks="0-正常 1-删除">
<constraints nullable="false" />
</column>
<column name="create_user" type="varchar(40)" remarks="创建者"/>
<column name="create_dtm" type="datetime" remarks="创建时间"/>
<column name="last_update_user" type="varchar(40)" remarks="更新者"/>
<column name="last_update_dtm" type="datetime" remarks="更新时间"/>
</createTable>
</changeSet>
</databaseChangeLog>
启动项目,就会执行未执行过的liquibase脚本
整合2
添加liquibase.properties文件
#liquibase,这里应该是配合liquibase插件一起使用的
#这里的changeLogFile路径,是一个相对路径
changeLogFile=liquibase/db.changelog-master.xml
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/testmybatisplus?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false&useSSL=false
username=root
password=123456
在pom中添加liquibase插件,插件版本号和liquibase版本一致
<!--liquibase插件-->
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>4.6.2</version>
<configuration>
<!--properties文件路径,该文件记录了数据库连接信息等-->
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
<!--配置参数,以禁用弹出的对话框,该对话框将确认非本地数据库上的迁移-->
<!--如果需要在父项目中配置子项目共享的LiquiBase配置,而各个子项目可以定义自己的配置,并覆盖父项目中的配置,
则只需要在父项目的pom中将propertyFileWillOverride设置为true即可-->
<propertyFileWillOverride>true</propertyFileWillOverride>
<!--生成文件的路径-->
<outputChangeLogFile>src/main/resources/liquibase/changelog_dev.xml</outputChangeLogFile>
<!-- <driver>com.mysql.jdbc.Driver</driver>
<url>jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8</url>
<username>root</username>
<password>123456</password>-->
</configuration>
</plugin>
老样子,搞一个changelog,就复制db.changelog-1.0.0.xml,改个id和表名,重命名为db.changelog-2.0.0.xml,然后就可以测试了。
测试前,先打开maven命令框,先mvn clean、mvn install一下。前两个对应插件中配置的生成文件,运行update测试即可
mvn liquibase:generateChangeLog:对当前数据库生成changelog(建表语句、数据插入语句)
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data:只对数据生成changelog。
mvn liquibase:update 将changelog变化的内容写入数据库
mvn liquibase:updateSQL 检查changelog语法的合法性
(注:一个changeset被执行生成一条changelog,后续还想修改语句,另起一个changeset,不可在已被执行的changeset里修改。除非去数据库把对应的changelog先删除,这样就可以在原先的changeset里写了)
参考
https://blog.csdn.net/weixin_45149355/article/details/111102499
https://www.cnblogs.com/zhaoyanhaoBlog/p/11344954.html