首页 > 其他分享 >SpringBoot整合Liquibase

SpringBoot整合Liquibase

时间:2023-07-22 18:45:20浏览次数:71  
标签:SpringBoot 数据库 boot liquibase Liquibase 整合 org import com

1、是什么?

Liquibase官网

Liquibase是一个开源的数据库管理工具,可以帮助开发人员管理和跟踪数据库变更。它可以与各种关系型数据库和NoSQL数据库一起使用,并提供多种数据库任务自动化功能,例如数据库迁移、版本控制和监控。Liquibase还提供了一个Web界面,可以方便地管理和跟踪数据库变更。它支持Java、Python、Ruby等多种语言,可以轻松地集成到现有的开发环境中。

2、能干嘛?

Liquibase主要功能包括:

  • 数据库迁移:可以方便地将数据库从一个版本迁移到另一个版本。
  • 版本控制:可以跟踪数据库变更的历史记录,并可以根据需要回滚到以前的版本。
  • 监控:可以监控数据库变更,并在发生变更时收到通知。
  • 自动化:可以自动化数据库任务,例如在应用程序部署之前检查数据库完整性。

Liquibase可以帮助开发人员更加高效地管理数据库,并减少由于数据库变更而导致的错误。

Liquibase的优点:

  • 配置文件支持SQL、XML、JSON 或者 YAML
  • 版本控制按序执行
  • 可以用上下文控制sql在何时何地如何执行
  • 支持schmea的变更
  • 根据配置文件自动生成sql语句用于预览
  • 可重复执行迁移
  • 可插件拓展
  • 可回滚
  • 可兼容14中主流数据库如oracle,mysql,pg等,支持平滑迁移
  • 支持schema方式的多租户(multi-tenant)

3、怎么玩?

这里主要使用SpringBoot整合Liquibase实现对数据库进行版本管理

(1) 引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ly</groupId>
    <artifactId>springboot-liquibase</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.0</version>
    </parent>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

        <dependency>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-core</artifactId>
            <version>4.23.0</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.28</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.18</version>
        </dependency>
    </dependencies>
</project>
(2) 配置数据源
package com.ly.config;

import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

import static com.ly.config.DataSourcesConfig.SPRING_DATASOURCE;

/**
 * @author ly (个人博客:https://www.cnblogs.com/ybbit)
 * @date 2023-07-22  16:28
 * @tags 喜欢就去努力的争取
 */
@ConfigurationProperties(prefix = SPRING_DATASOURCE)
@SpringBootConfiguration
@Data
public class DataSourcesConfig {

    public static final String SPRING_DATASOURCE = "spring.datasource";

    private String driverClassName;
    private String url;
    private String username;
    private String password;

    /**
     * 数据源配置
     *
     * @return
     */
    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(username);
        return dataSource;
    }
}

(3) 配置Liquibase
package com.ly.config;

import liquibase.integration.spring.SpringLiquibase;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;

import javax.sql.DataSource;

/**
 * @author ly (个人博客:https://www.cnblogs.com/ybbit)
 * @date 2023-07-22  14:53
 * @tags 喜欢就去努力的争取
 */
@ConditionalOnProperty(value = "spring.profiles.active", havingValue = "dev")
@SpringBootConfiguration
public class LiquibaseConfig {

    public static final String CHANGE_LOG_PATH = "classpath:/liquibase/db.changelog-master.xml";

    @Bean
    public SpringLiquibase liquibase(DataSource dataSource) {
        SpringLiquibase liquibase = new SpringLiquibase();
        liquibase.setChangeLog(CHANGE_LOG_PATH);
        liquibase.setDataSource(dataSource);
        liquibase.setShouldRun(true);
        return liquibase;
    }

}
(4) 创建db.changelog-master.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.1.xsd">

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

<!--    <includeAll path="change/" relativeToChangelogFile="true"/>-->

    <!--加入一张test_create_table表-->
    <include file="classpath:liquibase/change/changelog_v1.0.xml"></include>

    <!--给test_create_table表加一个email字段-->
    <include file="classpath:liquibase/change/changelog_v2.0.xml"></include>

    <!--修改test_create_table表加email字段-->
    <include file="classpath:liquibase/change/changelog_v3.0.xml"></include>

    <!--向test_create_table表加一条数据-->
    <include file="classpath:liquibase/change/changelog_v4.0.xml"></include>

</databaseChangeLog>
(5) 创建每一项的变更文件(推荐把各个模块的变更都分门别类的整理好)

changelog_v1.0.xml

<?xml version="1.1" 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-latest.xsd">
    <!--
     changeSet:每一个changeSet对应一个数据库相关的操作
      author:修改人
      id:唯一
    -->
    <!--加入一张表【test_create_table】-->
    <changeSet author="ly" id="2023072201-1">
        <createTable remarks="用户表" tableName="test_create_table">
            <column autoIncrement="true" name="id" type="INT" remarks="主键">
                <constraints nullable="false" primaryKey="true" unique="true"/>
            </column>
            <column name="username" remarks="用户名" type="VARCHAR(32)">
                <constraints unique="true" nullable="false"/>
            </column>
            <column name="password" remarks="密码" type="VARCHAR(100)">
                <constraints unique="false" nullable="false"/>
            </column>
        </createTable>
    </changeSet>
</databaseChangeLog>

changelog_v2.0.xml

<?xml version="1.1" 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-latest.xsd">
    <changeSet author="ly" id="2023072202-1">
        <!--加入一个email字段-->
        <addColumn tableName="test_create_table">
            <column name="email" type="VARCHAR(32)" remarks="邮箱">
                <constraints nullable="true"/>
            </column>
        </addColumn>
    </changeSet>
</databaseChangeLog>

changelog_v3.0.xml

<?xml version="1.1" 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-latest.xsd">
    <changeSet author="ly" id="2023072203-1">
        <!--重命名email列名称-->
        <renameColumn tableName="test_create_table" oldColumnName="email" newColumnName="newEmail" columnDataType="VARCHAR(50)"/>
    </changeSet>
</databaseChangeLog>

changelog_v4.0.xml

<?xml version="1.1" 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-latest.xsd">
    <changeSet author="ly" id="2023072204-1">
        <!--插入一条数据-->
        <insert tableName="test_create_table">
            <column name="id" value="1"></column>
            <column name="username" value="zs"></column>
            <column name="password" value="123"></column>
            <column name="newEmail" value="[email protected]"></column>
        </insert>
    </changeSet>
</databaseChangeLog>
(6) SpringBoot配置文件
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/qbb01
    username: root
    password: root
  profiles:
    active: dev
(7) Main
package com.ly;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

/**
 * @author ly (个人博客:https://www.cnblogs.com/ybbit)
 * @date 2023-07-22  14:52
 * @tags 喜欢就去努力的争取
 */
@EnableConfigurationProperties
@SpringBootApplication
public class LiquibaseApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(LiquibaseApplication.class)
                .run(args);
    }
}
(7) 启动日志

image

(8) 数据库

image

image

4、ChangeSet标签集与作用

(1) add
标签 说明
addAutoIncrement 将已存在的列改为自增列
addColumn 增加列
addDefaultValue 增加列的默认值
addForeignKeyConstraint 增加外键
addLookupTable 创建外键的关联表
addNotNullConstraint 增加非空值约束
addPrimaryKey 增加主键
addUniqueConstraint 增加唯一值约束
(2) create
标签 说明
createIndex 创建索引
createProcedure 创建存储过程
createSequence 创建序列
createTable 创建表
createView 创建视图
(3) drop
标签 说明
dropAllForeignKeyConstraints 删除全部外键约束
dropColumn 删除列
dropDefaultValue 删除默认值
dropForeignKeyConstraint 删除某一外键约束
dropNotNullConstraint 删除空值约束
dropPrimaryKey 删除主键
dropProcedure 删除存储过程
dropSequence 删除序列
dropTable 删除表
dropUniqueConstraint 删除唯一约束
dropView 删除视图
(4) rename
标签 说明
renameColumn 重命名列
renameSequence 重命名序列
renameTable 重命名表
renameView 重命名视图
5、sql
标签 说明
sql sql语句
sqlFile sql文件
6、其他
标签 说明
insert 插入数据
update 更新数据
delete 删除数
empty 空操作
executeCommand 执行命名
alterSequence 修改序列
customChange 自定义操作,需自己实现
loadData 导入csv数据至已存在的表中
loadUpdateData 导入csv数据至表中,表不存在则新建
mergeColumns 合并列
modifyDataType 修改数据类型
output 输出日志
setColumnRemarks 增加列说明
setTableRemarks 增加表说明
stop 停止liquibase
tagDatabase 打标签用于将来回滚

5、集成Maven插件

(1) 在pom.xml中加入下面的插件配置
<build>
        <plugins>
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <configuration>
                    <!--properties文件路径,该文件记录了数据库连接信息等-->
                    <propertyFile>src/main/resources/liquibase.properties</propertyFile>
                    <propertyFileWillOverride>true</propertyFileWillOverride>
                    <!--生成文件的路径-->
                    <outputChangeLogFile>src/main/resources/liquibase/change/changelog_base.xml
                    </outputChangeLogFile>
                </configuration>
            </plugin>
        </plugins>
    </build>
(2) 在resources目录下加入liquibase.properties配置文件
#要连接库配置信息
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/qbb01
username=root
password=root
#liquibase
changeLogFile=src/main/resources/liquibase/db.changelog-master.xml
(3) 根据当前配置的数据源生成changelog

image

(4) 结果

image

代码仓库:springboot-liquibase

标签:SpringBoot,数据库,boot,liquibase,Liquibase,整合,org,import,com
From: https://www.cnblogs.com/ybbit/p/17573860.html

相关文章

  • SpringBoot2.x—SpringCache的使用
    SpringCache(1)集成声明式与编程式说起SpringCache您可能不清楚。但您绝对清楚事务。一般使用事务分为编程式和声明式。编程式:事务操作与业务代码耦合,一般我们不会使用这种方式;声明式:AOP的运用,通过注解使得事务代码与业务代码解耦,目前项目中一般都是使用事务注解。而我们平时......
  • SpringBoot学习之路(一):SpringBoot的开发环境
    【说在前面的话】    作为一个java小白,从自己写下“HelloWorld!”开始,到现在使用spring框架开始写一点小练习项目,让自己的一开始对java的好奇,变成现在要掌握它的目标。身为一个学生,我现在还是有很多的时间去学到更多的,俗话说:“好记性不如烂笔头”,我虽然做不到,但是“烂键......
  • springboot三
    神器之整合通用Mapper的开发方法通用mapper的开发方法是做练习的神器,它是基于mybatis的一款MyBatis增强插件,可以提供一些常用增、删、改、查的操作,不需要重复写一些常用的sql。简化操作,精简代码,并且达到代码风格统一的目的。它的出现不是为了替代mybatis,而是让myb......
  • ssm整合
    一、准备工作1、导入依赖jar包<dependencies>  <!--Junit-->  <dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.12</version>  </dependency>  <!--数据库驱动--&g......
  • springboot二
    对springboot的一些补充在具体的应用开发中可以使用properties配置文件或者yaml配置文件两种一般建议开发中首选yml格式的文件,文件后缀可以是yml或者yaml。可以通过格式缩进的方式表达层次结构。解析yml格式的文件需要依赖snakeyaml,这个依赖由web-starter依赖引......
  • springboot~redisson中使用lua脚本的问题
    起因事情是这样的,我在通过redission进行限流时,用到了在lua脚本里进行数值计算,而我在本地测试过程中,发现所有tonumber()方法时,返回值都是nil,这个原因最后找到了,是没有配置序列化的方式,出现错误提示如下:org.redisson.client.RedisException:ERRErrorrunningscript(calltof_......
  • springboot原理
    SpringApplication.run()执行流程:1.初始化监听器、自定义监听器。2.发布ApplicationStartedEvent事件(监听ApplicationStartedEvent方法:1、实现ApplicationStartedEvent  2、SpringApplication.addListener())3.装配参数和环境,确定是web环境还是非web环境。4.装配完环境后,......
  • springboot学习之十三(druid+mybaits plus)
    Druid介绍Druid是阿里巴巴的一个开源项目,号称为监控而生的数据库连接池,在功能、性能、扩展性方面都超过其他例如DBCP、C3P0、BoneCP、Proxool、JBossDataSource等连接池,而且Druid已经在阿里巴巴部署了超过600个应用,通过了极为严格的考验,这才收获了大家的青睐! Springboot集成......
  • 【转载】SpringBoot 通用限流方案
    一、背景限流对于一个微服务架构系统来说具有非常重要的意义,否则其中的某个微服务将成为整个系统隐藏的雪崩因素,为什么这么说?举例来讲,某个SAAS平台有100多个微服务应用,但是作为底层的某个或某几个应用来说,将会被所有上层应用频繁调用,业务高峰期时,如果底层应用不做限流处理,该应用......
  • SpringBoot 使用jasypt 对敏感字段加密
    com.github.ulisesbocchiojasypt-spring-boot-starter2.1.2如果SpringBoot项目中使用了@SpringBootApplication或者@EnableAutoConfiguration,在项目里添加jasypt-spring-boot-starter依赖会自动对项目中整个属性(包括系统属性,环境属性,命令行参数, applicat......