SpringBoot 集成Liquibase

174 阅读2分钟

一、Liquibase简介

  • 官网:www.liquibase.org/

  • LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。

  • 支持几乎所有主流的数据库,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;

  • 支持多开发者的协作维护;

  • 日志文件支持多种格式,如XML, YAML, JSON, SQL等;

  • 支持多种运行方式,如命令行、Spring集成、Maven插件、Gradle插件等;

二、liquibase常用标签介绍

changeSet:用于单次执行的最大单元,表操作都应在该标签里面

属性解释示列值
id修改项的唯一标识,不可以重复,一般按 表名_年月日_自增idts_sys_code_20230621_01
author作者
<changeSet id="ts_file_01" author="chengpengai">
  <createTable tableName="ts_file" remarks="系统文件表">
    <column name="id" type="varchar(32)"  remarks="主键ID">
      <constraints primaryKey="true" nullable="false"/>
    </column>
    <column name="file_no" type="varchar(50)" remarks="文件编号"/>
  </createTable>
</changeSet>

<changeSet id="ts_sys_code_20230424_01" author="chengpengai">
  <sql>
    INSERT INTO `ts_sys_code` (`id`, `type`, `type_e`, `code`, `val`, `parent_code`, `level`, `sorted`, `version`, `deleted`, `creator`, `updater`, `create_time`, `update_time`, `comments`) VALUES (REPLACE(UUID(),'-',''), '项目阶段', 'PROJECT_STAGE', 'BUSINESS_STAGE', '商务阶段', NULL, 1, 1, 0, b'0', '', NULL, NOW(), NULL, '');
  </sql>
</changeSet>

........

createTable: 创建表

属性解释示列值
tableName表名称
remarks表注释
<changeSet id="ts_file_01" author="chengpengai">
  <createTable tableName="ts_file" remarks="系统文件表">
    <column name="id" type="varchar(32)"  remarks="主键ID">
      <constraints primaryKey="true" nullable="false"/>
    </column>

    <column name="file_no" type="varchar(50)" remarks="文件编号"/>
    <column name="file_name" type="varchar(100)" remarks="文件名称"/>
    <column name="file_path" type="varchar(255)" remarks="文件相对路径"/>
    <column name="file_suffix_type" type="varchar(20)" remarks="文件后缀类型"/>
    <column name="file_upload_type" type="char(2)" remarks="文件上传指定类型(0:图片 1:音频 2:视频 3:文档 4:安装包 9:其他)"/>
    <column name="file_size" type="varchar(50)" remarks="文件大小"/>

    <!-- 表标准字段  -->
    <column name="version" type="int" defaultValueNumeric="0" remarks="版本">
      <constraints nullable="false"/>
    </column>
    <column name="deleted" type="bit" defaultValueBoolean="false" remarks="是否删除">
      <constraints nullable="false"/>
    </column>
    <column name="creator" type="varchar(32)" defaultValue="" remarks="创建人ID"/>
    <column name="create_time" type="datetime" defaultValueComputed="CURRENT_TIMESTAMP" remarks="创建时间">
      <constraints nullable="false"/>
    </column>
    <column name="updater" type="varchar(32)" remarks="更新人ID"/>
    <column name="update_time" type="datetime" remarks="更新时间"/>
    <column name="comments" type="varchar(255)" remarks="备注"/>
    <!-- 表标准字段  -->

  </createTable>
</changeSet>

addColumn:添加表字段

<changeSet id="tb_project_info_20230417_01" author="chengpengai">
  <addColumn tableName="tb_project_info">
    <column name="total_cost" type="float" remarks="项目总费用" afterColumn="init_man_hour"/>
  </addColumn>
</changeSet>

modifyDataType:修改表字段类型

<changeSet id="tb_project_info_20230417_02" author="chengpengai">
  <modifyDataType tableName="tb_project_info" columnName="init_man_hour" newDataType="float"/>
</changeSet>

dropColumn:删除表字段

<changeSet id="tb_project_info_20230516_02" author="chengpengai">
  <dropColumn tableName="tb_project_info" columnName="total_cost"/>
</changeSet>

column:字段信息

属性解释示列值
name字段名称
type字段类型
remarks字段描述
defaultValue字符类型 默认值
defaultValueNumeric数值类型 默认值
defaultValueDate日期类型 默认值
defaultValueBoolean布尔类型 默认值
autoIncrement自动递增1
<column name="id" type="varchar(32)"  remarks="主键ID">
  <!-- 创建主键索引 -->
  <constraints primaryKey="true" nullable="false"/>
</column>

<column name="project_no" type="varchar(50)" remarks="项目编号" defaultValue=""/>

<column name="deleted" type="bit" defaultValueBoolean="false" remarks="是否删除">
  <!-- 声明该字段不能为空 -->
  <constraints nullable="false"/>
</column>

createIndex:创建索引

属性解释示列值
tableName表名称
indexName索引名称
unique唯一索引true/fasle
clustered聚合索引true/false
<!-- 普通索引 -->
<createIndex tableName="ts_sys_code" indexName="index_name">
  <column name="name"/>
</createIndex>

<!-- 唯一索引 -->
<createIndex tableName="ts_sys_code" indexName="index_name" unique="true" >
  <column name="name"/>
</createIndex>

<!-- 聚合索引 -->
<createIndex tableName="ts_sys_code" indexName="index_name" clustered="true">
  <column name="name"/>
  <column name="age“/>
</createIndex>

三、用法

SpringBoot集成Liquibase

1. 引入maven坐标 / 引入gradle坐标

 <!-- https://mvnrepository.com/artifact/org.liquibase/liquibase-core -->
 <dependency>
     <groupId>org.liquibase</groupId>
     <artifactId>liquibase-core</artifactId>
     <version>4.0.0</version>
 </dependency>
// https://mvnrepository.com/artifact/org.liquibase/liquibase-core
implementation group: 'org.liquibase', name: 'liquibase-core', version: '4.0.0'

2.目录结构

截屏2023-06-21 上午9.40.44.png

3.相关配置文件添加

添加表的操作日志文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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.3.xsd">

 <changeSet id="ts_sys_code_01" author="chengpengai">
  <!--创建表-->
   <createTable tableName="ts_sys_code" remarks="系统字典表">
     <column name="id" type="varchar(32)"  remarks="主键ID">
       <constraints primaryKey="true" nullable="false"/>
     </column>

     <column name="type" type="varchar(50)" remarks="类型"/>
     <column name="type_e" type="varchar(50)" remarks="类型英文名称"/>
     <column name="code" type="varchar(50)" remarks="编码"/>
     <column name="val" type="varchar(50)" remarks="编码值"/>
     <column name="parent_code" type="varchar(50)" remarks="上级编码"/>
     <column name="level" type="int(11)" remarks="层级"/>
     <column name="sorted" type="int(11)" remarks="排序"/>

     <!-- 表标准字段  -->
     <column name="version" type="int" defaultValueNumeric="0" remarks="版本">
       <constraints nullable="false"/>
     </column>
     <column name="deleted" type="bit" defaultValueBoolean="false" remarks="是否删除">
       <constraints nullable="false"/>
     </column>
     <column name="creator" type="varchar(32)" defaultValue="" remarks="创建人ID"/>
     <column name="create_time" type="datetime" defaultValueComputed="CURRENT_TIMESTAMP" remarks="创建时间">
       <constraints nullable="false"/>
     </column>
     <column name="updater" type="varchar(32)" remarks="更新人ID"/>
     <column name="update_time" type="datetime" remarks="更新时间"/>
     <column name="comments" type="varchar(255)" remarks="备注"/>
     <!-- 表标准字段  -->

   </createTable>
 </changeSet>

 <changeSet id="ts_sys_code_20230424_02" author="chengpengai">
   <!--定义要执行的sql语句-->
   <sql>
     INSERT INTO `ts_sys_code` (`id`, `type`, `type_e`, `code`, `val`, `parent_code`, `level`, `sorted`, `version`, `deleted`, `creator`, `updater`, `create_time`, `update_time`, `comments`) VALUES (REPLACE(UUID(),'-',''), '项目状态', 'PROJECT_STATUS', 'ON_SCHEDULE', '按计划进行中', NULL, 1, 1, 0, b'0', '', NULL, NOW(), NULL, '');
     INSERT INTO `ts_sys_code` (`id`, `type`, `type_e`, `code`, `val`, `parent_code`, `level`, `sorted`, `version`, `deleted`, `creator`, `updater`, `create_time`, `update_time`, `comments`) VALUES (REPLACE(UUID(),'-',''), '项目状态', 'PROJECT_STATUS', 'DELAYED', '计划有变/延后', NULL, 1, 2, 0, b'0', '', NULL, NOW(), NULL, '');
     INSERT INTO `ts_sys_code` (`id`, `type`, `type_e`, `code`, `val`, `parent_code`, `level`, `sorted`, `version`, `deleted`, `creator`, `updater`, `create_time`, `update_time`, `comments`) VALUES (REPLACE(UUID(),'-',''), '项目状态', 'PROJECT_STATUS', 'DELAY', '进度延迟', NULL, 1, 3, 0, b'0', '', NULL, NOW(), NULL, '');
   </sql>
 </changeSet>
 
 <changeSet id="ts_sys_code_20230424_03" author="chengpengai">
   <!-- 添加表字段 -->
   <addColumn tableName="ts_sys_code">
     <column name="total_cost" type="float" remarks="项目总费用" afterColumn="level"/>
   </addColumn>
 </changeSet>
 
<changeSet id="ts_sys_code_20230417_04" author="chengpengai">
   <!-- 修改数据类型 -->
   <modifyDataType tableName="ts_sys_code" columnName="total_cost" newDataType="decimal(10,2)"/>
</changeSet>

<changeSet id="ts_sys_code_20230516_05" author="chengpengai">
  <!--字段删除-->
  <dropColumn tableName="ts_sys_code" columnName="total_cost"/>
</changeSet>
     
</databaseChangeLog>

添加changelog.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
                    http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.3.xsd">

   <!-- 系统基础表 -->
   <include file="classpath:liquibase/changelog/business/base/ts_sys_code.xml" relativeToChangelogFile="false"/>
   <include file="classpath:liquibase/changelog/business/base/ts_file.xml" relativeToChangelogFile="false"/>
  
   <includeAll path="classpath:liquibase/changelog/business/base" relativeToChangelogFile="false"/>

 </databaseChangeLog>

4.添加liquibase配置

 spring:
    liquibase:
       # 配置changelog.xml 文件的地址
       change-log: classpath:liquibase/changelog.xml
       #是否开启liqubase
       enabled: true
       #数据库相关配置
       url: ${spring.datasource.url}
       user: ${spring.datasource.username}
       password: ${spring.datasource.password}