前言

不知不觉已过去一个月,7月12入职了现在这家公司。首先工资涨了30%,其次技术栈是主流技术栈。再也不用看亚信的appframe了。()。但是现在也没之前那样舒服了,需求也挺多。
说说Liquibase吧,Liquibase 是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在 changelog文件中,便于版本控制,它的目标是提供一种数据库类型无关的解决方案,通过执行 schema 类型的文件来达到迁移。

SpringBoot集成Liquibase

添加依赖

因为 Spring Boot 已经内置支持整合 Liquibase,我们只需要在项目工程中引入 Liquibase 的依赖进行配置即可。

		<!-- 集成Liquibase 组件维护数据及数据表的迭代 -->
		<dependency>
			<groupId>org.liquibase</groupId>
			<artifactId>liquibase-core</artifactId>
		</dependency>

配置application

项目上是这么配置的

spring: 
  #是否开启liquibase 默认true      
  liquibase:
    enabled: true
    change-log: classpath:liquibase/release/master.xml    

更具体点配置如下

#低版本前没有spring.  2.1版本后配置为spring.liquibase
# 启用liquibase
liquibase.enabled=true
# 存储变化的文件(changelog)位置
liquibase.change-log=classpath:sample_change.sql
# 检查存储变化的文件是否存在
liquibase.check-change-log-location=true
# 分环境执行,若在 changelog 文件中设置了对应 context 属性,则只会执行与 dev 对应值的 changeset
liquibase.contexts=dev
# 执行前首先删除数据库,默认 false。若设置为 true,则执行变更前,会先删除目标数据库,请谨慎
liquibase.dropFirst=false
# 执行更新时将回滚 SQL 写入的文件路径
liquibase.rollback-file=
# 如果使用工程已配置的 datasource 数据源,则以下三个数据库连接参数可不配置
## 访问数据库的连接地址
liquibase.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
# 访问数据库的用户名
liquibase.user=test
# 访问数据库的密码
liquibase.password=test

此时,在项目启动时,会去执行spring.liquibase.change-log文件。建议使用
xml配置格式的changeLogs文件

XML具体配置如下

变更级分类

changeSet 分为 6类:

  • add
  • create
  • drop
  • rename
  • sql
  • other

官方文档:https://docsstage.liquibase.c...,每一个标签都有其必须的参数,使用时根据情况自行设定即可

用法均为如下格式:

<changeSet>
    <xxxx />
</changeSet>

image.png

image.png

2.3 drop

image.png

image.png

2.6 Other

image.png

2.常用变更集

上面这么多的标签,相信已经将很多人的眼睛看花了,不要紧,将它们全部罗列出主要还是想大家能够对 Liquibase 有一个更全面的理解,遇到某些场景时能够对症检索。

接下来我会介绍几个常用的标签,基本能够覆盖大多数场景。

2.1 SQL

最常用以及最顺手的就是 sql 标签,开发人员像使用 Mybatis 一样,写原生SQL,但是如果SQL比较复杂,可读性就不怎么好

<changeSet id="xxxx" author="jiaotd" labels="init" >
        <sql>
            USE `db_xxx`;
              insert into table_t values(1,1,1);
        </sql>
 </changeSet>

2.2 sqlFile

sqlFIle 就是将上面 SQL 中的语句单独使用文件存储,在 sqlFIle 引入。

这样做的好处是 changelog 文件简单、整洁、可读性高、易于维护。

 <changeSet id="xxxx" author="jiaotd" labels="init" >
    <sqlFile path="update/xxxx.sql" relativeToChangelogFile="true"/>
 </changeSet>

2.3 loadData

loadData 通常用于导入数据,一般我们用于系统升级时导入大量的数据。

<changeSet  author="jiaotd"  id="loadData-xxx">  
    <loadData commentLineStartsWith="//"  
            encoding="UTF-8"  
            file="example/users.csv"  
            quotchar="'"  
            relativeToChangelogFile="true"  
            schemaName="public"  
            separator=";"  
            tableName="person"  
            usePreparedStatements="true">  
        <column  header="header1"  
                name="id"  
                type="NUMERIC"/>  
        <column  index="3"  
                name="name"  
                type="BOOLEAN"/>  
    </loadData>  
</changeSet>

参考链接

Spring Boot 简单集成 Liquibase
changeSet配置
liquibase最佳实践