写点什么

SpringBoot 结合 Liquibase 实现数据库变更管理

  • 2023-05-10
    湖南
  • 本文字数:3138 字

    阅读完需:约 10 分钟

Spring Boot 和 Liquibase 结合使用,可以简化数据库变更管理的流程,同时也保证了数据的一致性和可追踪性。本文将深入讲解如何在 Spring Boot 应用中集成 Liquibase,并实现数据库变更管理。


注:本文中使用的示例代码基于 Spring Boot 2.5.0 和 Liquibase 4.3.5 版本。

一、Liquibase 简介

Liquibase 是一个开源的数据库变更管理工具,支持多种数据库(如 MySQL、Oracle、SQL Server 等),可以通过 XML、YAML 或 SQL 格式定义数据库变更脚本。Liquibase 可以自动执行这些脚本,并记录每次变更的信息,以便后续进行回滚或比较数据库状态等操作。

二、准备工作

2.1 创建 Spring Boot 项目

首先我们需要创建一个新的 Spring Boot 项目,可以使用 Spring Initializr 进行快速初始化,也可以手动创建。这里使用 Spring Initializr。


打开 start.spring.io/ 页面,选择以下选项:

  • Project:Maven Project

  • Language:Java

  • Spring Boot:2.5.0

  • Packaging:Jar

  • Java:11


在 Dependencies 选项卡中搜索并添加以下依赖:

  • Spring Web

  • Spring Data JPA

  • H2 Database

  • Liquibase


完成后点击 Generate 按钮下载项目压缩包并解压到本地。

2.2 配置 Maven

在项目根目录下的 pom.xml 文件中添加 Liquibase 的 Maven 插件:

<plugins>  <plugin>    <groupId>org.liquibase</groupId>    <artifactId>liquibase-maven-plugin</artifactId>    <version>4.3.5</version>    <configuration>      <propertyFile>src/main/resources/liquibase.properties</propertyFile>    </configuration>    <dependencies>      <dependency>        <groupId>com.microsoft.sqlserver</groupId>        <artifactId>mssql-jdbc</artifactId>        <version>8.4.1.jre11</version>      </dependency>    </dependencies>  </plugin></plugins>
复制代码

Liquibase 的 Maven 插件提供了一些用于管理数据库变更的命令,如生成变更脚本、执行变更脚本等。此外,我们还需要在 Maven 中添加 mssql-jdbc 依赖,以支持操作 SQL Server 数据库。

2.3 配置 Liquibase

在项目的 src/main/resources 目录下创建一个名为 liquibase.properties 的文件,用于配置 Liquibase 运行时的参数,具体配置如下:

changeLogFile=src/main/resources/db/changelog/db.changelog-master.xmldriver=com.microsoft.sqlserver.jdbc.SQLServerDriverurl=jdbc:sqlserver://localhost:1433;databaseName=my_databaseusername=sapassword=123456
复制代码

其中:

  • changeLogFile:指定 Liquibase 执行的变更日志文件

  • driver:指定数据库驱动类型

  • url:指定要连接的数据库 URL

  • username:指定连接数据库时使用的用户名

  • password:指定连接数据库时使用的密码


请根据实际情况修改相应参数。

三、编写变更脚本

src/main/resources/db/changelog 目录下创建一个名为 db.changelog-master.xml 的文件,用于指定其他变更日志文件的位置。Liquibase 会在启动时自动查找并执行这些日志文件中定义的变更。

<?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-4.3.xsd">  <include file="001-initial-schema.xml"/></databaseChangeLog>
复制代码

接下来我们需要编写变更脚本来定义具体的操作。


创建一个名为 001-initial-schema.xml 的文件,用于定义初始化数据库 schema 的操作。该文件位于 src/main/resources/db/changelog 目录下。代码如下:

<?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-4.3.xsd">  <changeSet id="001" author="binjie09">    <createTable tableName="person">      <column name="id" type="bigint" autoIncrement="true">        <constraints primaryKey="true" nullable="false"/>      </column>      <column name="name" type="varchar(255)">        <constraints nullable="false"/>      </column>      <column name="age" type="integer"/>    </createTable>  </changeSet></databaseChangeLog>
复制代码

该脚本定义了一个名为 person 的表,包含三个字段:idnameage。其中,id 为主键,并设置为自增字段。

四、Spring Boot 集成 Liquibase

接下来,我们需要在 Spring Boot 应用中集成 Liquibase。在 src/main/java 目录下创建一个名为 com.example.demo 的包,然后创建一个名为 DemoApplication.java 的文件作为启动类。代码如下:

@SpringBootApplicationpublic class DemoApplication {
public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }
}
复制代码

4.1 配置 Liquibase 属性

在 src/main/resources/application.properties 文件中添加以下配置:

liquibase.change-log=classpath:/db/changelog-master.xml
复制代码

该配置指定了 Liquibase 执行的变更日志文件,与 liquibase.properties 中的 changeLogFile 属性相对应。

4.2 运行时自动执行脚本

由于我们已经在项目中添加了 Liquibase 的 Maven 插件,我们可以使用 Maven 命令来执行 Liquibase 操作。但这种方式需要手动执行,不够便捷。


现在我们希望 Spring Boot 在启动时自动检查并执行脚本,而无需手动运行命令。为此,我们需要在启动类中添加相关配置。


修改 DemoApplication.java 文件,添加 LiquibaseConfig 类:

@Configurationpublic class LiquibaseConfig {
@Bean public SpringLiquibase liquibase(DataSource dataSource) { SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(dataSource); liquibase.setChangeLog("classpath:/db/changelog-master.xml"); return liquibase; }
}
复制代码

该类使用 SpringLiquibase 类来配置自动执行 Liquibase 操作。

4.3 测试

至此,我们已经完成了 Spring Boot 和 Liquibase 的集成。现在我们可以启动应用并运行一些测试代码,以验证集成是否成功。


首先,在 src/test/java 目录下创建一个名为 com.example.demo 的包。然后创建一个名为 DemoApplicationTests.java 的文件,用于编写测试代码。

@SpringBootTestclass DemoApplicationTests {
@Autowired private JdbcTemplate jdbcTemplate;
@Test void testCreateTable() { List<Map<String, Object>> result = jdbcTemplate.queryForList("SELECT * FROM person"); Assert.assertEquals(0, result.size()); }
}
复制代码

该测试代码使用了 JdbcTemplate 来查询 person 表中的数据。由于我们尚未添加任何数据,所以期望结果应该为空。


运行测试代码,如果没有报错并输出了预期结果,则说明集成成功。现在我们可以继续编写其他的变更脚本,并使用 Liquibase 来自动管理数据库变更了。

五、总结

本文详细介绍了 Spring Boot 和 Liquibase 的集成方式,并给出了相应的示例代码以便读者参考。当然,这只是基础用法的演示,实际项目中可能会遇到更复杂的需求,例如多数据源、多租户等。希望本文能为读者提供一些启示,为使用 Liquibase 管理数据库变更提供帮助。


作者:Cosolar

链接:https://juejin.cn/post/7230771916856262714

来源:稀土掘金

用户头像

还未添加个人签名 2021-07-28 加入

公众号:该用户快成仙了

评论

发布
暂无评论
SpringBoot 结合 Liquibase 实现数据库变更管理_Java_做梦都在改BUG_InfoQ写作社区