SpringBoot 集成 LiquiBase

实验环境

  • IDEA
  • Spring Boot:2.4.4
  • LiquiBase:3.10.3
  • Gradle:6.8.3
  • Mysql:8.0.23
  • (可选)Navicat

Liquibase 简介

liquibase官网

liquibase入门教程

Liquibase 是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在 XML 文件中,便于版本控制。

Liquibase 具备如下特性:

  • 不依赖于特定的数据库,目前支持包括 Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché 等 12 种数据库,这样在数据库的部署和升级环节可帮助应用系统支持多数据库;
  • 提供数据库比较功能,比较结果保存在 XML 中,基于该 XML 你可用 Liquibase 轻松部署或升级数据库;
  • 以 XML 存储数据库变化,其中以作者和 ID 唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作;
  • 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化(ChangSet);
  • 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态;
  • 可生成数据库修改文档(HTML格式);
  • 提供数据重构的独立的 IDE 和 Eclipse 插件。

核心概念

Changelog 文件

开发人员将数据库更改存储在本地开发计算机上的基于文本的文件中,并将其应用于本地数据库。这些变更日志文件存储在源代码中管理,以实现协作开发。changelog 文件可用于更新团队使用的所有不同数据库环境 —— 从本地开发数据库到测试,暂存和生产。可以任意嵌套 Changelog 文件以进行更好的管理。
更多 Changelog 相关说明

ChangeSet

ChangeSet 是跟踪执行的单位。每个 ChangeSet 由 author,id 和 Changelog 文件唯一标识。当 Liquibase 运行时,它会查询标记为已执行的 ChangSet 的 DATABASECHANGELOG 表,然后执行更改日志文件中尚未执行的所有 ChangeSet。
更多 ChangeSet 相关说明

Change

每个 ChangeSet 通常包含一个或多个 Change,Change 描述要应用于数据库的变更或操作。在支持的数据库列表中,Liquibase支持使用描述性更改类型生成的 SQL 和原始 SQL 。通常,每个 ChangeSet 应只有一个 Change,以避免语句的自动提交失败,以至数据库处于意外的状态。
更多 Change 相关说明

Preconditions

Preconditions 既可以应用于整个 Changelog,也可以应用于单个 ChangeSet。Preconditions 根据数据库的状态控制更新的执行,并且可以暂停更新,跳过变更集,将变更集标记为运行或显示警告。
更多 Preconditions 相关说明

Contexts

可以将 Contexts 应用于 ChangeSet,以控制在不同环境中运行的 ChangeSet。例如,某些 ChangeSet 可以标记为 production,另一些可以标记为 test。如果未指定 Contexts,则无论执行 Contexts 如何,ChangSet 都将运行。可以在 ChangeSet 中将上下文指定为逻辑表达式,以更精确地控制执行。
更多 Contexts 相关说明

Labels

与上下文相似,Labels也可以应用于 ChangeSet,以控制执行哪些 ChangeSet。与可能是复杂表达式的 contexts 相反,Labels 是每个 ChangeSet 上的简单列表。但是对于 Labels,可以在运行时提供复杂的表达式。Contexts 和 Labels 的组合提供了对执行 ChangeSet 的细粒度控制。
更多 Labels 相关说明

Liquibase Hub

Liquibase Hub 是一个仪表板,可提供实时监视,报告和对团队数据库发布自动化的见解。
更多 Liquibase Hub 相关说明

实验步骤

  1. 实验前提:已经使用 idea 新建 Spring Boot 工程,建构工具使用Gradle;

  2. 在 build.gradle 文件中 dependencies 中添加 liquibase 依赖

    implementation 'org.liquibase:liquibase-core'
    

gradle

Ctrl + Shift + O 加载 Gradle 变化

  1. 配置Liquibase

    • 方式一:
      Spring Boot 本身支持 Liquibase,所以 build.gradle 文件添加 Liquibase 依赖后,在 application.yml/application.properties 定制配置信息即可,项目启动时就会去运行指定目录下的 Changelog 文件。若不配置,默认在 resource/db/changelog 目录下找 db.changelog-mastert.yml文件;

      liquibase:
      change-log: classpath:/db/lacerate-master.xml
      

    • 方式二:
      编写Liquibase配置类

      • LiquibaseConfig.java

        package club.lacerate.common.config;
             
        import liquibase.integration.spring.SpringLiquibase;
        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
             
        import javax.sql.DataSource;
             
        /**
        * Liquibase配置类
        *
        * @author zhaoff
        */
        @Configuration
        public class LiquibaseConfig {
        @Bean
        public SpringLiquibase liquibase(DataSource dataSource) {
         SpringLiquibase liquibase = new SpringLiquibase();
         liquibase.setDataSource(dataSource);
         // 指定changelog的位置,这里使用的一个master文件引用其他文件的方式
         liquibase.setChangeLog("classpath:db/lacerate-master.xml");
         liquibase.setContexts("development,test,production");
         liquibase.setShouldRun(true);
         return liquibase;
        }
        }
        
  2. 编写Changelog文件

在 db 目录下的 lacerate-master.xml 为 liquibase 的入口,通过 include 标签将其它的 changelog 文件引入进来。
db/lacerate-master.xml

   <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.1.xsd">
   
       <includeAll path="db/changelogs/" relativeToChangelogFile="false"/>
   
   </databaseChangeLog>
   ````
   db/changelogs/lacerate-1.0.xml

xml

   <changeSet id="1" author="lacerate" context="test">
       <sql>
           <![CDATA[
               CREATE TABLE `tbl_test` (
                 `id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
                 `text` varchar(50) DEFAULT '',
                 PRIMARY KEY (`id`)
               ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

               INSERT INTO tbl_test (id, text) VALUES (1, "test");
           ]]>
       </sql>
   </changeSet>


```

  1. 测试

启动Spring Boot 项目;项目启动成功后,使用 navicat 查看数据库test:

测试成功!

SpringBoot 集成 Liquibase 完成!

附:liquibase 最佳实践