在项目中,如果要对数据库的结构进行调整,一般情况下简单处理就是直接对数据库执行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表中的字段新增也成功了
这样,基本满足了我们在开发过程中对表结构更新的需求。至于其他的回滚什么的操作,暂时还不需要在应用程序上去做。