SpringBoot整合Liquibase

SpringBoot整合Liquibase

1、Liquibase简介

​ LiquiBase官网地址

LiquiBase 是一个数据库重构和迁移的开源框架,通过日志的方式来记录数据库的变更。通过执行日志文件中的修改,将数据库更新或回滚到达一致的状态。

2、SpringBoot整合LiquiBase

2.1 pom引入依赖

<dependency>
    <groupId>org.liquibasegroupId>
    <artifactId>liquibase-coreartifactId>
dependency>


<dependency>
    <groupId>mysqlgroupId>
    <artifactId>mysql-connector-javaartifactId>
    <version>8.0.18version>
dependency>
2.2 创建配置文件
  1. 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.4.xsd">
    <include file="classpath:/liquibase/change_log/init_table.xml" relativeToChangelogFile="false"/>
    <include file="classpath:/liquibase/change_log/init_data.xml" relativeToChangelogFile="false"/>
databaseChangeLog>

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

  1. init_table.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 id="20220523-01" author="izy">
        <sqlFile path="classpath:liquibase/sql/default.sql"/>
    changeSet>
		
    <changeSet id="20220523-02" author="izy">
        <sqlFile path="classpath:liquibase/sql/table_2022052301.sql"/>
    changeSet>
databaseChangeLog>

如果数据库结构发生了变化,再添加一个,指定对应的sql文件

  1. default.sql
-- test.test definition

CREATE TABLE `test2` (
                        `test_id` bigint(20) NOT NULL AUTO_INCREMENT,
                        `code` varchar(20) DEFAULT '0',
                        `name` varchar(255) DEFAULT '',
                        `createDate` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                        PRIMARY KEY (`test_id`),
                        KEY `codeandname` (`code`,`name`,`createDate`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
  1. table_2022052301.sql

    -- test.test3 definition
    
    CREATE TABLE `test3` (
                             `test_id` bigint(20) NOT NULL AUTO_INCREMENT,
                             `code` varchar(20) DEFAULT '0',
                             `name` varchar(255) DEFAULT '',
                             `createDate` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                             PRIMARY KEY (`test_id`),
                             KEY `codeandname` (`code`,`name`,`createDate`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
    
  2. init_data.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 id="20220523-01" author="izy">
        <sqlFile path="classpath:liquibase/data/init_data.sql"/>
    changeSet>
databaseChangeLog>
  1. init_data.sql
-- test.test2 definition
INSERT INTO test.test2 (test_id, code, name, createDate) VALUES(24, '24', '24', NULL);
  1. 文件结构
    SpringBoot整合Liquibase_第1张图片
2.3 yml配置
# 应用服务 WEB 访问端口
server:
  port: 8080
# 应用名称
spring:
  application:
    name: demo-liquibase-base
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    username: root
    password: root
  liquibase:
    change-log: classpath:/liquibase/master.xml
#    default-schema: st_jtlsp_interlib_sync # pgsql使用
#    liquibase-schema: st_jtlsp_interlib_sync # pgsql使用
2.4项目启动

项目启动前,需要将对应的数据库test创建好

项目在启动的过程中,就会执行未执行过的liquibase脚本,运行结果如下:
SpringBoot整合Liquibase_第2张图片

DATABASECHANGELOG表、DATABASECHANGELOGLOCK表是liquibase自带的表

表名 说明
DATABASECHANGELOG 记录的是每一次表修改的记录,里面会详细记录操作的类型和操作。
DATABASECHANGELOGLOCK 用于确保两台计算机不会同时尝试修改数据库,锁库。
2.5 备注
  1. master.xml可以和change_log中的文件进行合并,只要yml中的配置正确

    spring:
    	liquibase:
        change-log: classpath:/liquibase/master.xml
    
  2. changeLog除了指定sql脚本,还可以通过标签的方式,具体可参考官网文档,示例:

    <databaseChangeLog
    	xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    	xmlns:pro="http://www.liquibase.org/xml/ns/pro"
    	xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
    		http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.9.xsd
    		http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
    		http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.9.xsd">			
    	<property  name="clob.type"  value="clob"  dbms="oracle,postgresql"/>
    	<property  name="clob.type"  value="longtext"  dbms="mysql"/>
    	<property  name="table.name"  value="tableA"/>
    				
    	<changeSet  id="1"  author="joe">
    		<createTable  tableName="${table.name}">
    			<column  name="id"  type="int"/>
    			<column  name="${column1.name}"  type="${clob.type}"/>
    			<column  name="${column2.name}"  type="int"/>
    		createTable>
    	changeSet>
    databaseChangeLog>
    

3、基于liquibase对数据库的回滚操作

暂时不会

你可能感兴趣的:(SpringBoot,Java,spring,boot,java,数据库)