SpringBoot项目集成liquibase,数据库版本控制解决方案

news/2023/5/28 7:25:25

liquibase 数据库版本留痕解决方案,在实际生产过程中如何高效管理数据库的DDL与DML语句,对这些语句留痕处理。如果能将sql的执行与SpringBoot项目启动结合在一起,每次启动项目自动执行新增的sql语句,这样就可以使得项目组成员各个都保持相同的开发库,避免人为操作导致数据库不符合预期。

文章目录

    • 一,准备工作
    • 二,准备changelog-master
    • 三,准备changelog_init文件
    • 四,准备自己的changelog文件
    • 五,liquibase执行原理

一,准备工作

<!-- 首先引入liquibase依赖, 版本推荐4.5.0以上 -->
<dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId><version>4.5.0</version>
</dependency><!-- 接着引入liquibase插件, 如果你的数据库已经有表和数据了可以使用该插件反向生成xml文件 -->
<plugin><groupId>org.liquibase</groupId><artifactId>liquibase-maven-plugin</artifactId><version>3.5.1</version><configuration><propertyFile>src/main/resources/db/liquibase.properties</propertyFile><propertyFileWillOverride>true</propertyFileWillOverride><outputChangeLogFile>src/main/resources/liquibase/changelog/changelog_init.xml</outputChangeLogFile></configuration>
</plugin>

outputChangeLogFile标签指定后续插件生成的脚本存放目录,插件中指定了一个src/main/resources/db/liquibase.properties的路径配置文件,配置文件内容如下:

# liquibase
changeLogFile=src/main/resources/liquibase/changelog-master.xml
# MySql
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/reggie?characterEncoding=utf-8&serverTimezone=UTC
username=root
password=mysqlroot

二,准备changelog-master

​  根据自己喜好,在resources目录下创建changelog目录,也就是liquibase目录,推荐使用resources->db->changelog->changelog_init.xml这样的目录结构,我的目录结构如下:

image-20230118210756108

  changelog-master是整个liquibase的核心,SpringBoot项目启动的时候会自动去寻找这个文件,当然我们需要现在SpringBoot配置文件中启用liquibase

spring.liquibase.enabled=true
spring.liquibase.change-log=classpath:db/changelog-master.xml

​  有了master文件之后我们就可以把我们的sql文件写入或导入其中,或者指向另一个changelog的地址以区分不同的版本,目前我是指向了其他的changelog文件

<!-- changelog-master -->
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttps://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd"><include file="classpath:db/changelog/changelog_init.xml"/><include file="classpath:db/changelog/changelog_v1.0.xml"/>
</databaseChangeLog>

​  这样SpringBoot项目启动的时候就会去读取我的changelog-master文件,读取之后他会发现我这个文件引入了其他两个文件,他会按照先后顺序去读取这两个文件的内容,这样后续每一个大版本都可以用一个changelog来管理。

  如果启动报错,找不到指定文件,可以参考这篇博客:https://blog.csdn.net/zy_zhangruichen/article/details/128540204

三,准备changelog_init文件

​  前面说过如果我们的项目是中途想引入liquibase,数据库此时已经有了表和数据怎么办?那我们需要把数据库导出成liquibase能够识别的格式,然后作为xml文件交给liquibase,让其帮我们管理。

​  如果配置了第一步的插件,那我们直接点击idea右侧的maven,选择plugins,然后liquibase:generateChangeLog:

image-20230118211826776

​  那么liquibase就会自动帮我们生成一个初始化的文件,将这个文件作为changelog_init.xml交给liquibase管理即可,但这种生成的文件只包含DDL语句,并没有数据的INSERT语句,需要自己手动处理。

四,准备自己的changelog文件

​  开发过程中,如果有需要提交的DDL语句或DML语句,可以按版本规划先写一个changelog文件,接着在这个changelog文件中引入sql或直接在标签中填入sql:

<!-- 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/dbchangeloghttps://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.5.xsd"><!--changeset:一个changelog可以包含多个changeset标签,每个changeset都由id、author、filepath属性唯一标识,当liquibase执行数据库changeLog时,他会按顺序读取changeSet,并针对每个changeSet检查databasechangelog表,已查看是否已经运行过id/author/filepath的组合,如果已运行且没有runAlways标签则会跳过该changeSetauthor:作者id:最好使用<项目名-时间戳>来命名区分runAlways:执行每次运行时设置的更改,即使之前已经运行过了context:灵活控制脚本在哪些环境中执行--><changeSet id="reference-20230101-1400" author="y"><sqlFile path="../sql/mysql_init_data.sql" relativeToChangelogFile="true" /></changeSet><changeSet id="reference-20230103-2122" author="y"><sqlFile path="../sql/mysql_dml_data_v1-1.sql" relativeToChangelogFile="true" /></changeSet><changeSet id="reference-20230107-1951" author="y"><sqlFile path="../sql/mysql_ddl_data_v1-1.sql" relativeToChangelogFile="true" /></changeSet><changeSet id="reference-20230107-1952" author="y"><sqlFile path="../sql/mysql_dml_data_v1-2.sql" relativeToChangelogFile="true" /></changeSet><changeSet id="reference-20230107-2101" author="y"><sql>ALTER TABLE ticket MODIFY COLUMN `DATE` DATETIME;</sql></changeSet><changeSet id="reference-20230107-2257" author="y"><sql>ALTER TABLE ticket ADD COLUMN `createtime` DATETIME COMMENT '创建时间';ALTER TABLE ticket ADD COLUMN `updatetime` DATETIME COMMENT '更新时间';</sql></changeSet><changeSet id="reference-20230108-1245" author="y"><sql>ALTER TABLE ticket ADD COLUMN version INT(10) DEFAULT 1 COMMENT '版本号';</sql></changeSet><changeSet id="reference-20230108-1347" author="y"><sql>ALTER TABLE ticket ADD COLUMN isdeleted INT(1) DEFAULT 0 COMMENT '逻辑删除,0未删除,1已删除';</sql></changeSet>
</databaseChangeLog>

五,liquibase执行原理

​  liquibase是怎么做到执行过的sql不再执行呢,其实在SpringBoot项目启动之后,它会在数据库中新增两张表,分别是DATABASECHANGELOGDATABASECHANGELOGLOCK,前面这张表会把我们的changelog文件执行记录都记录下来,并生成md5秘钥,每次启动的时候会判断md5值是否相等,所以sql文件一旦执行就不能修改了,而后面这张表是数据库分布式锁的解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.exyb.cn/news/show-4565823.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

中间件-消息队列

中间件-消息队列 英文全称&#xff1a;message queue 将 MQ 掰开了揉碎了来看&#xff0c;就是「一发一存一消费」&#xff0c;再直白点就是一个「转发器」。生产者先将消息投递到「队列」中&#xff0c;然后再从这个「队列」中取出消息&#xff0c;最后再转发给消费者。 可…

后开发时代的房地产丨财务RPA 在地产业的应用场景

近年&#xff0c;房地产行业进入平缓发展期&#xff0c;新房需求量下滑、资金成本持续上升、利润空间缩减&#xff0c;地产业竞争早已进入白热化。 上半年突然而至的新冠肺炎疫情&#xff0c;使整个房地产行业迅速进入了严冬&#xff0c;房地产业遭受开工复工推迟、销售交易量…

C#详细学习教程

C#详细学习教程c#Vs基本设置快捷键堆栈和静态存储区变量var特点转义字符条件语句ifswitch语句循环封装数组字符串trim的用法String类的方法构造函数静态构造函数类枚举this关键字1) 使用 this 表示当前类的对象2) 使用 this 关键字串联构造函数3) 使用 this 关键字作为类的索引…

单据自动匹配,一键打印……你想要的回单解决方案,浪潮全都有

企业取得银行回单后&#xff0c;将其与对应的单据、凭证匹配粘贴&#xff0c;一直是企业财务人员非常头疼的工作之一。这项工作看起来简单&#xff0c;但实际上需要取回单、查找单据凭证、打印、粘贴、归档等多步琐碎的工作才能完成&#xff0c;如果企业交易频繁&#xff0c;工…

华为云城市智能中枢再升级,为新型智慧城市建设打个样儿

关注云报洞察深一度我国的“十四五”规划和2035年远景目标纲要中明确提出&#xff0c;“分级分类推进新型智慧城市建设”。过去这些年&#xff0c;我国一直在积极探索具有中国特色的新型智慧城市建设道路&#xff0c;并不断加大相关领域的投资。IDC的数据显示&#xff0c;中国在…

重构修练笔记 Refactoring Xiu Lian Notes (1) - 练气期

笔记纯属虚构&#xff0c;如有雷同&#xff0c;纯属巧合 万物皆有定数&#xff0c;普通人入门练气期一味求快&#xff0c;只满足身体自身需求&#xff0c;对于后面更高层级没有远见&#xff0c;导致后面越修炼越难&#xff0c;极其不便和难受&#xff0c;从而有人直接崩盘而道陨…

TL-WAR308路由器桥接设置

项目需要,新买了一个路由器,周末有空给它配置一下. 路由器型号TP-LINK TL-WAR308 八口的无线路由器,默认网段192.168.1.1 公司主路由器192.168.31.1网段. 新路由器桥接到主路由器并单独wifi名称(无线,有线都可以联网) 要点:1.新路由器Lan口设置为192.168.31.2 (注意不要设…

家庭无线路由器桥接设置

图1 路由器无线桥接示意图 主路由器以水星MW300R为例 副路由器以迅捷FW300R为例 一、主路由器设置 1.LAN口设置ip地址&#xff08;也可以默认不改&#xff0c;但要记下参数为辅路由器设置用&#xff09; 图2 主路由器LAN口的ip地址 2.DHCP服务器设置&#xff08;也可以默认不…

JavaEE2-Spring核心与设计思想

目录 1.Spring是什么&#xff1f; 2.容器是什么&#xff1f; 3.IoC是什么&#xff1f; 3.1.传统程序开发 3.2.控制反转式程序开发 3.3.对比总结规律 4.理解Spring IoC 4.1.将对象(Bean)存入到容器(Spring)&#xff1b; 4.2.从容器中取出对象。 5.DI概念说明 1.Spring…

无向图的双连通分量算法详解 + 模板题 :冗余路径 矿场搭建 Critical Network Lines

在了解无向图的双连通分量之前大家可以先了解一下有向图的双连通分量&#xff0c;因为里面很多数组是一样的。(16条消息) 有向图强连通分量tarjan算法详解&#xff08;适合新手&#xff09; 模板题&#xff1a;《信息学奥赛一本通》 , USACO , HAOI2006 受欢迎的牛_wsh1931的博…

寒假每日一题——懒惰的牛

懒惰的牛 问题描述 这是一个炎热的夏日。 懒洋洋的奶牛贝茜想将自己放置在田野中的某个位置&#xff0c;以便可以在短距离内尽可能多地吃到美味的草。 贝茜所在的田野中共有 N 片草地&#xff0c;我们可以将田野视作一个一维数轴。 第 i 片草地中包含 gi 单位的青草&#…

没有选品经验的电商卖家该在TikTok上卖什么商品?超店有数来帮你

TikTok近年来增速迅猛&#xff0c;凭借巨大的流量频频登榜多国APP下载榜首&#xff0c;而其电商业务同样处于快速增长状态。2022上半年&#xff0c;TikTok电商的GMV已超10亿美元&#xff1b;2022年全年&#xff0c;TikTok Shop在东南亚GMV增长逾三倍&#xff0c;达到44亿美元。…

2019.08.16 日常总结

洛谷P3071&#xff1a; 题意&#xff1a; 有一排n个座位&#xff0c;m次操作。A操作&#xff1a;将a名客人安置到最左的连续a个空位中&#xff0c;没有则不操作。L操作&#xff1a;[a,b]的客人离开。 求A操作的失败次数 思路&#xff1a;线段树的题目&#xff0c;就是复杂了…

[HihoCoder-1185] 连通性·三 【tarjan+缩点】

题面&#xff1a; 描述 暑假到了!!小Hi和小Ho为了体验生活&#xff0c;来到了住在大草原的约翰家。今天一大早&#xff0c;约翰因为有事要出去&#xff0c;就拜托小Hi和小Ho忙帮放牧。 约翰家一共有N个草场&#xff0c;每个草场有容量为W[i]的牧草&#xff0c;N个草场之间有…

poj 2373:Dividing the Path 灌溉草场(优先队列问题)

总时间限制: 1000ms 内存限制: 65536kB 描述 Farmer John’s cows have discovered that the clover growing along the ridge of the hill in his field is particularly good. To keep the clover watered, Farmer John is installing water sprinklers along the ridge…

POJ 2373 Dividing the Path(灌溉草场)

描述 在一片草场上:有一条长度为L (1 < L < 1,000,000&#xff0c; L为偶数)的线段。 John的N (1 < N < 1000) 头奶牛都沿着草场上这条线段吃草&#xff0c;每头牛的活动范围是一个开区间(S,E)&#xff0c; S&#xff0c; E都是整数。不同奶牛的活动范围可以有重叠…

poj 2373 灌溉草场【动态规划】- 难度★★★★★

Dividing the PathTime Limit: 1000MS Memory Limit: 65536KTotal Submissions: 5350 Accepted: 1872DescriptionFarmer Johns cows have discovered that the clover growing along the ridge of the hill in his field is particularly good. To keep the clover watered, F

动态规划之灌溉草场

划分为的子问题为&#xff1a;F[x]表示喷洒范围恰好覆盖直线上的区间[0,X]时&#xff0c;最少需要多少个喷头。 X需要满足以下条件&#xff1a; 1.X为偶数 2.X不位于任何奶牛的活动范围内 3.X>2A 4.当X>2B时&#xff0c;存在Y∈[X-2B,X-2A]且满足上述条件时&#xff0c;F…

30天自制操作系统(二)汇编语言学习与Makefile入门

1 介绍文本编辑器这部分可直接略过2 继续开发helloos.nas中核心程序之前的内容和启动区以外的内容先不讲了&#xff0c;因为还涉及到一些软盘方面的知识。然后来讲的是helloos.nas这个文件; hello-os ; TAB4ORG 0x7c00 ; 指明程序的装载地址; 以下这部分记录…

曾经的理发店小弟,现在是阿里P10技术大牛

热文导读 | 点击标题阅读金九银十跳槽季如何进阶找到合适满意的工作&#xff1f;大公司病&#xff08;太形象了&#xff09;阿里P7程序员、资深架构师&#xff0c;竟不知jvm、红黑树&#xff01;这都能进大厂&#xff1f;原文&#xff1a;转载自微信公众号【阿里味儿】送一碗“…