1 Liquibase 介绍
SpringBoot 官方文档中推荐了两款工具来管理数据库版本:Flyway
和 Liquibase
。前者我没有在项目中使用过,所以本文就只讨论 Liquibase。
使用 Liquibase 需要定义一堆 XML 文件,这些 XML 称为 changelog 文件。每个 changelog 文件中又包含多个变化集合 changeSet,每个 changeSet 记录了作者、改变的内容。changeSet 中要修改的内容,通过 createTable
、addColumn
等标签进行操作。通过这种 XML 文件的方式,就可以将代码版本与数据库版本关联在一起。项目启动,会自动执行 changelog XML 文件。Liquibase 具有执行锁,已经执行过的内容不会重复执行。在执行 changeSet 时,由于改动的内容可以通过 Liquibase 提供的标签编写,所以无关具体的数据库产品(MySQL、Oracle 等),Liquibase 底层会根据实际使用的数据库类型转化为对应的 SQL。
通过上面的描述,可以看出 Liquibase 带来的几个好处:
- 支持多类型的数据库产品,无需维护 SQL 脚本;
- 项目启动可以自动升级数据库;
- 代码版本与数据库版本关联在一起。
2 在老项目中使用 Liquibase
在咱们的 demo hero-springboot-demo
中,之前已经手动通过 SQL 语句创建了数据库表 computer
,现在想通过 Liquibase 来管理数据库版本和维护表结构,该怎么办呢?本节就通过这个案例来说明已存在的老项目中如何引用 Liquibase。
2.1 配置 Maven 插件
Liquibase 提供了 Maven 插件,使用该插件可以根据数据库逆向生成 changlog 文件。在 pom.xml 的 plugins
下添加 Liquibase 插件:
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<version>4.9.1</version>
<configuration>
<propertyFileWillOverride>true</propertyFileWillOverride>
<outputChangeLogFile>temp/temp-changelog.xml</outputChangeLogFile>
<driver>com.mysql.cj.jdbc.Driver</driver>
<url>jdbc:mysql://127.0.0.1:3306/hero_springboot_demo?useUnicode=true&characterEncoding=utf8&useSSL=true</url>
<username>root</username>
<password>Mysql.123</password>
<outputFileEncoding>UTF-8</outputFileEncoding>
<verbose>true</verbose>
<diffTypes>tables, views, columns, indexs,foreignkeys, primarykeys, uniqueconstraints, data</diffTypes>
</configuration>
</plugin>
上面配置 Liquibase 的 Maven 插件:数据库连接信息和Liquibase生成规则配置。生成的