SpringBoot集成Liquibase

一、前言

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

liquibase说白了就是一个将你的数据库脚本转化为xml格式保存起来,其中包含了你对数据库的改变,以及数据库的版本信息,方便数据的升级和回滚等操作。

二、SpringBoot集成Liquibase

2.1 导入依赖

maven:

	<!-- https://mvnrepository.com/artifact/org.liquibase/liquibase-core -->
	<dependency>
	   <groupId>org.liquibase</groupId>
	   <artifactId>liquibase-core</artifactId>
	   <version>4.5.0</version>
	</dependency>

gradle:

// https://mvnrepository.com/artifact/org.liquibase/liquibase-core
implementation group: 'org.liquibase', name: 'liquibase-core', version: '4.5.0'

2.2 Liquibase配置文件application.yml

spring:
  datasource:
    url: jdbc:mysql://xxx.xxx.x.xxx:xxxx/liquibase?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
  liquibase:
    #导包后默认开启,可以不用设置
    enabled: true
    #主文件路径,可以不配置,不配置会默认去找resource/db/changelog文件夹下找db.changelog-master.yaml文件,如果找不到则会启动报错,如下图
    change-log: /liquibase/master.xml

在这里插入图片描述
当然,也可以不写配置文件,使用config bean代替,如下:LiquibaseConfig.java

@Configuration
public class LiquibaseConfig {

    @Bean
    public SpringLiquibase liquibase(DataSource dataSource) {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setDataSource(dataSource);
        //指定changelog的位置,这里使用的一个master文件引用其他文件的方式
        liquibase.setChangeLog("classpath:liquibase/master.xml");
        //liquibase.setContexts("development,test,production");
        liquibase.setShouldRun(true);
        return liquibase;
    }
    
}

2.3 创建Liquibase文件

这里建的文件夹路径要和配置文件中的路径对应。
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">

    <!--
    1:includeAll 标签可以把一个文件夹下的所有 changelog 都加载进来。如果单个加载可以用 include。
    2:includeAll 标签里有两个属性:path 和 relativeToChangelogFile。
        2.1:path (在 include 标签里是 file):指定要加载的文件或文件夹位置
        2.2:relativeToChangelogFile :文件位置的路径是否相对于 root changelog 是相对路径,默认 false,即相对于 classpath 是相对路径。
    3: include 标签可以单独指定某一个文件。
    -->

    <include file="liquibase/changelog/changelog-1.0.xml" />
    <!--<includeAll path="liquibase/changelog/" relativeToChangelogFile="false"/>-->
    <!--<include file="liquibase/changelog/changelog-1.2.xml" relativeToChangelogFile="false"/>-->

</databaseChangeLog>

changelog-1.0.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">

    <!--建表-->
    <changeSet author="Felix.Du" id="20211029-01">
        <createTable tableName="dh_project_category" remarks="项目类型表">
            <column name="id" type="varchar(64)" remarks="项目类型id">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(255)" remarks="类目类型名称"/>
            <column name="status" type="int(11)" remarks="状态。1正常,2删除"/>
            <!--test-->
            <column name="remark" type="varchar(255)" remarks="备注"/>
        </createTable>
    </changeSet>

    <!--建主键-->
    <changeSet author="Felix.Du" id="20211029-02">
        <preConditions onFail="MARK_RAN">
            <not>
                <primaryKeyExists tableName="T_TABLE_NAME" primaryKeyName="ID" />
            </not>
        </preConditions>
        <addPrimaryKey columnNames="ID" tableName="T_TABLE_NAME" />
    </changeSet>

    <!--增加字段-->
    <changeSet author="Felix.Du" id="20211029-03">
        <preConditions onFail="MARK_RAN">
            <not>
                <columnExists tableName="T_TABLE_NAME" columnName="CODE" />
            </not>
        </preConditions>
        <addColumn tableName="T_TABLE_NAME">
            <column name="CODE" remarks="" type="VARCHAR2(40)" />
        </addColumn>
    </changeSet>

    <!--删除字段-->
    <changeSet author="Felix.Du" id="20211029-04">
        <dropColumn columnName="code1" tableName="T_TABLE_NAME" />
    </changeSet>

    <!--更新数据-->
    <changeSet author="Felix.Du" id="20211029-05" dbms="oracle" failOnError="false">
        <sql splitStatements="false" stripComments="true">
            update t_table_name s set s.code=s.code1
        </sql>
    </changeSet>

</databaseChangeLog>

id:数据库保存的唯一id
author:对数据库进行修改的负责人,方便出问题的时候能找到对应的负责人。

使用如上的语法基本上能满足平常的工作需要,当然还有更多的功能,读者可以自行百度。当你进行如上操作,启动项目后,会看到数据库会新增两个关于liquibase的表。在这里插入图片描述
databasechangelog:记录的是每一次表修改的记录,里面会详细记录操作的类型和操作。
部分字段释义:
ID:唯一id,在changeSet标签中的id属性配置
AUTHOR : 作者(操作人)
FILENAME:本次操作执行的文件路径+文件名
DATEEXECUTED: 执行日期
ORDEREXECUTED:执行顺序
EXECTYPE:执行类型(已执行,执行失败)
MD5SUM:MD5
DESCRIPTION : 描述
COMMENTS
TAG
LIQUIBASE : liqubase的版本号
CONTEXTS : 备注,可以在changeSet标签中的context属性配置
LABELS :
DEPLOYMENT_ID : Liquibase自动生成的一个id

databasechangeloglock:用于确保两台计算机不会同时尝试修改数据库。

当然也可以直接在changeSet标签中引sql文件。
changelog.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">

    <changeSet context="新建mine_admin表" id="20211029-06" author="Felix.Du">
        <sqlFile path="liquibase/sql/mine.sql"/>
    </changeSet>

</databaseChangeLog>

mine.sql文件:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for mine_admin
-- ----------------------------
DROP TABLE IF EXISTS `mine_admina`;
CREATE TABLE `mine_admina` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) DEFAULT NULL COMMENT '密码',
  `name` varchar(50) DEFAULT NULL COMMENT '姓名',
  `status` tinyint(1) DEFAULT NULL COMMENT '启用状态0->禁用,1->启用',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='后台管理员';

SET FOREIGN_KEY_CHECKS = 1;

注意:changeSet标签中的id属性不能重复!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值