文章
问答
冒泡
spring boot 集成liquibase 实现数据库的版本控制

在项目中,如果要对数据库的结构进行调整,一般情况下简单处理就是直接对数据库执行sql操作,但是这样既不安全也不规范。目前java环境下,主流的可以通过liquibase和flyway来实现,这里我们主要介绍spring boot与liquibase的集成。

环境

  • spring boot:2.5.3
  • liquibase:4.5.0

 添加依赖

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
    <version>4.5.0</version>
</dependency>

 
安装maven插件

<build>
    <plugins>
        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>4.5.0</version>
            <configuration>
                <propertyFile>${project.basedir}/src/main/resources/liquibase.properties</propertyFile>
                <changeLogFile>${project.basedir}/src/main/resources/db/db.changelog-master.xml</changeLogFile>
                <outputChangeLogFile>${project.basedir}/src/main/resources/db/changelog/init-table.xml</outputChangeLogFile>
                <propertyFileWillOverride>true</propertyFileWillOverride>
            </configuration>
        </plugin>
    </plugins>
</build>

liquibase.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://x.x.x.:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
username=root
password=123456


配置spring boot下的liquibase开启

spring.liquibase.enabled=true
spring.liquibase.change-log=classpath:/db/db.changelog-master.xml

change-log的路径默认是一个yaml ,但是感觉yaml不习惯,还是改成了xml

生成初始化的脚本
执行mvn 的 liquibase:generateChangeLog 生成初始化脚本

创建/src/main/resources/db/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
https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd">
<!--    <include file="classpath:db/changelog/init-table.xml" relativeToChangelogFile="false"/>-->
</databaseChangeLog>

项目启动的时候会liquibase会去找这个文件,然后,执行里面的脚本。这里我们把init-tabel.xml注释掉,因为数据库已经有了这些数据,执行会失败。
我们写一个添加字段的脚本试试

<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.1.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
    <changeSet  author="baneshi (generated)" id="202110081633" >
        <addColumn tableName="u_user">
            <column name="test_id" type="varchar(36)"/>
        </addColumn>
    </changeSet>
</databaseChangeLog>


把这个xml文件引入到master.xml下。然后启动程序。

可以看到数据下创建了两张表

  • DATABASECHANGELOG
  • DATABASECHANGELOGLOCK

并且DATABASECHANGELOG中有一条记录


user表中的字段新增也成功了


这样,基本满足了我们在开发过程中对表结构更新的需求。至于其他的回滚什么的操作,暂时还不需要在应用程序上去做。


关于作者

落雁沙
非典型码农
获得点赞
文章被阅读