SpringBoot整合Liquibase
1、是什么?
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="zs@163.com"></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) 启动日志

(8) 数据库


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

(4) 结果

代码仓库:springboot-liquibase
SpringBoot整合Liquibase的更多相关文章
- springboot集成liquibase,h2数据库
Liquibase是一个用于跟踪.管理和应用数据库变化的开源的数据库重构工具.它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制. Liquibase具备如下特性:* 不依赖于特 ...
- spring-boot整合mybatis(1)
sprig-boot是一个微服务架构,加快了spring工程快速开发,以及简便了配置.接下来开始spring-boot与mybatis的整合. 1.创建一个maven工程命名为spring-boot- ...
- SpringBoot整合Mybatis之项目结构、数据源
已经有好些日子没有总结了,不是变懒了,而是我一直在奋力学习springboot的路上,现在也算是完成了第一阶段的学习,今天给各位总结总结. 之前在网上找过不少关于springboot的教程,都是一些比 ...
- springboot整合mq接收消息队列
继上篇springboot整合mq发送消息队列 本篇主要在上篇基础上进行activiemq消息队列的接收springboot整合mq发送消息队列 第一步:新建marven项目,配置pom文件 < ...
- springboot整合mybaits注解开发
springboot整合mybaits注解开发时,返回json或者map对象时,如果一个字段的value为空,需要更改springboot的配置文件 mybatis: configuration: c ...
- SpringBoot整合Redis、ApachSolr和SpringSession
SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...
- SpringBoot整合ElasticSearch实现多版本的兼容
前言 在上一篇学习SpringBoot中,整合了Mybatis.Druid和PageHelper并实现了多数据源的操作.本篇主要是介绍和使用目前最火的搜索引擎ElastiSearch,并和Spring ...
- SpringBoot整合Kafka和Storm
前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...
- SpringBoot整合SpringCloud搭建分布式应用
什么是SpringCloud? SpringCloud是一个分布式的整体解决方案.SpringCloud为开发者提供了在分布式系统中快速构建的工具,使用SpringCloud可以快速的启动服务或构建应 ...
- SpringBoot整合RabbitMQ-整合演示
本系列是学习SpringBoot整合RabbitMQ的练手,包含服务安装,RabbitMQ整合SpringBoot2.x,消息可靠性投递实现等三篇博客. 学习路径:https://www.imooc. ...
随机推荐
- 使用HTML一键打包IPA工具打包KRPANO全景项目
该软件已经被GDB苹果网页一键打包工具取代,详情参考如下链接 GDB苹果网页一键打包 HTML一键打包IPA(苹果应用)工具可以把本地HTML项目或者网站打包为一个苹果应用IPA文件,无需编写任何代码 ...
- Avalonia开发(二)项目结构解析
一.前言 在Avalonia开发(一)环境搭建 文章中介绍了Avalonia的介绍.开发环境的搭建.项目创建,以及项目FirstAvaloniaApp项目结构的介绍.本篇文章将介绍各平台的项目介绍. ...
- TCP vs UDP:揭秘可靠性与效率之争
概述 今天我们开始主要讲解TCP的相关知识点.在之前讲解分层章节的时候,我们提到过一个重要观点.在网络层及以下几层,更多的是让主机与主机建立连接,也就是说你的电脑需要知道另一台电脑在哪里才能连接上它. ...
- 9.2 运用API实现线程同步
Windows 线程同步是指多个线程一同访问共享资源时,为了避免资源的并发访问导致数据的不一致或程序崩溃等问题,需要对线程的访问进行协同和控制,以保证程序的正确性和稳定性.Windows提供了多种线程 ...
- 基于 P-Tuning v2 进行 ChatGLM2-6B 微调实践
微调类型简介 1. SFT监督微调:适用于在源任务中具有较高性能的模型进行微调,学习率较小.常见任务包括中文实体识别.语言模型训练.UIE模型微调.优点是可以快速适应目标任务,但缺点是可能需要较长的训 ...
- 02-RAID技术 学习心得
RAID 术语 扇区:是磁盘中最小的存储单元,向磁盘读写数据时是以扇区为最小单元进行存储 block:block,是由N个扇区组成一个块: 在磁盘相同偏移处横向逻辑分割,就形成了stripee: 一个 ...
- sqlserver在设计表结构时,如何选择字段的数据类型
在设计表结构时,选择适当的字段数据类型是非常重要的,它会直接影响数据库的性能.存储空间和数据的完整性.以下是在 SQL Server 中选择字段数据类型时的一些建议和理由: 1. 整数类型:在 SQL ...
- Windows 95 的辉煌诞生历史
1992 年 2 月,Windows 3.1 的研发即将结束,而 Windows 团队正忙得不亦乐乎地计划他们的下一盘大棋.到了 3 月 5 日,他们终于悠哉悠哉地敲定了战略大计:横扫桌面.笔记本.移 ...
- vue中数字和字符串的转换问题(v-bind和v-model的使用)
可以看到上面自增加时,成了拼接字符串的效果. 打开vue工具查看: 此时n和sum都是数字,可以正常自增加,但是操作了section之后,n就变成了字符串: 此时再执行自增加,sum也会变成字符串形式 ...
- 全局关闭Unity编译的CS警告
实现方式 Editor和Game的全局CSharp编译配置文件名: Assets/mcs.rsp 添加如下内容可屏蔽对应的警告信息 -nowarn:1234 常用内容 CS0219 未使用的publi ...