当前位置: 首页 > news >正文

Springboot整合liquIbase组件

liquIbase方式

1、添加依赖
<!-- Liquibase 依赖 -->
<dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId>
</dependency>
2、添加配置项
spring:# datasource 数据源配置内容,对应 DataSourceProperties 配置属性类datasource:url: jdbc:mysql://127.0.0.1:3306/lab-20-liquibase?useSSL=false&useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.jdbc.Driverusername: root # 数据库账号password: # 数据库密码# Liquibase 配置内容,对应 LiquibaseProperties 配置项liquibase:enabled: true # 开启 Liquibase 功能。默认为 true 。change-log: classpath:/db/changelog/db.changelog-master.yaml # Liquibase 配置文件地址url: jdbc:mysql://127.0.0.1:3306/lab-20-liquibase?useSSL=false&useUnicode=true&characterEncoding=UTF-8 # 数据库地址user: root # 数据库账号password: # 数据库密码
3、添加版本变更Log配置项

db目录下的db.changelog-master.yaml

databaseChangeLog:- changeSet: # 对应一个 ChangeSet 对象id: 0 # ChangeSet 编号author: yunai # 作者comments:# 备注- changeSet: # 对应一个 ChangeSet 对象id: 1 # ChangeSet 编号author: yunai # 作者comments: 初始化 users 表 # 备注changes: # 对应 Change 数组。Change 是一个接口,每种操作对应一种 Change 实现类- createTable: # 创建表,对应 CreateTableChange 对象。tableName: users # 表名remarkds: 用户表 # 表注释columns: # 对应 ColumnConfig 数组- column:name: id # 字段名type: int # 字段类型autoIncrement: true # 自增constraints: # 限制条件,对应一个 ConstraintsConfig 对象primaryKey: true # 主键nullable: false # 不允许空- column:name: usernametype: varchar(64)constraints:nullable: false- column:name: passwordtype: varchar(32)constraints:nullable: false- column:name: create_timetype: datetimeconstraints:nullable: false- insert: # 插入记录,对应 InsertDataChange 对象。tableName: users # 表名columns: # 对应 ColumnConfig 数组- column:name: username # 字段名value: yudaoyuanma # 值- column:name: passwordvalue: password- column:name: create_timevalue: now()- changeSet: # 对应一个 ChangeSet 对象id: 2 # ChangeSet 编号author: yunai # 作者comments: 初始化 users2 表 # 备注changes: # 对应 Change 数组。Change 是一个接口,每种操作对应一种 Change 实现类- sqlFile: # 使用 SQL 文件,对应 SQLFileChange 对象encoding: utf8path: classpath:db/changelog/sqlfile/CHAGE_SET_2_INIT_DB.sql- changeSet: # 对应一个 ChangeSet 对象id: 3 # ChangeSet 编号author: yunai # 作者comments: 修复 `users` 的用户名 # 备注changes: # 对应 Change 数组。Change 是一个接口,每种操作对应一种 Change 实现类- customChange: {class: cn.iocoder.springboot.lab20.databaseversioncontrol.migration.CHANGE_SET_3_FixUsername} # 对应 CustomTaskChange
4、SQL文件
-- 创建用户表
CREATE TABLE `users2` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号',`username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号',`password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码',`create_time` datetime DEFAULT NULL COMMENT '创建时间',PRIMARY KEY (`id`),UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;-- 插入一条数据
INSERT INTO `users2`(username, password, create_time) VALUES('yudaoyuanma', 'password', now());
5、版本控制测试
public class CHANGE_SET_3_FixUsername implements CustomTaskChange {private Logger logger = LoggerFactory.getLogger(getClass());@Overridepublic void execute(Database database) throws CustomChangeException {JdbcConnection connection = (JdbcConnection) database.getConnection();try (PreparedStatement psmt = connection.prepareStatement("SELECT id, username, password, create_time FROM users")) {try (ResultSet rs = psmt.executeQuery()) {while (rs.next()) {String username = rs.getString("username");if ("yudaoyuanma".equals(username)) {Integer id = rs.getInt("id");// 这里,再来一刀更新操作,偷懒不写了。logger.info("[migrate][更新 user({}) 的用户名({} => {})", id, username, "yutou");}}}} catch (Exception e) {throw new RuntimeException(e);}}@Overridepublic String getConfirmationMessage() {return null;}@Overridepublic void setUp() throws SetupException {}@Overridepublic void setFileOpener(ResourceAccessor resourceAccessor) {}@Overridepublic ValidationErrors validate(Database database) {return null;}}

相关文章:

Springboot整合liquIbase组件

liquIbase方式 1、添加依赖 <!-- Liquibase 依赖 --> <dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId> </dependency>2、添加配置项 spring:# datasource 数据源配置内容&#xff0c;对应…...

Apache Paimon 实时数据湖 Streaming Lakehouse 的存储底座

摘要&#xff1a;本文整理自阿里云开源大数据表存储团队负责人&#xff0c;阿里巴巴高级技术专家李劲松&#xff08;之信&#xff09;&#xff0c;在 Streaming Lakehouse Meetup 的分享。内容主要分为四个部分&#xff1a; 流计算邂逅数据湖 Paimon CDC 实时入湖 Paimon 不止…...

计算机网络(10) --- 高级IO

计算机网络&#xff08;9&#xff09; --- 数据链路层与MAC帧_哈里沃克的博客-CSDN博客数据链路层与MAC帧https://blog.csdn.net/m0_63488627/article/details/132178583?spm1001.2014.3001.5501 1.IO介绍 1.IO本质 1.如果数据没有出现&#xff0c;那么读取文件其实会被阻塞住…...

学习中ChatGPT的17种用法

ChatGPT本质上是一个聊天工具&#xff0c;旧金山的人工智能企业OpenAI于2022年11月正式推出ChatGPT。那么&#xff0c;ChatGPT与其他人工智能产品相比有什么特殊呢&#xff1f; 它除了可以回答结构性的问题&#xff0c;例如语法修正、翻译和查找答案之外。最关键的是它能够去解…...

融合CDN 如何有效的抵抗DDoS攻击

绝大部分对外网站所有者都离不开CDN的支持&#xff0c;据统计&#xff0c;全球高达70%的互联网流量都是通过CDN来进行缓存和加速的&#xff0c;不论是国外知名的CDN厂商&#xff1a;如Cloudflare、AWS、Akamai等&#xff0c;还是国内主流的CDN厂商阿里云华为云腾讯云等&#xf…...

Git 原理与使用

1.版本控制器 所谓的版本控制器&#xff0c;就是能让你了解到⼀个⽂件的历史&#xff0c;以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统&#xff0c;同时也⽅便多⼈协同作业。 ⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑…...

如何批量加密PDF文件并设置不同密码 - 批量PDF加密工具使用教程

如果你正在寻找一种方法来批量加密和保护你的PDF文件&#xff0c;批量PDF加密工具是一个不错的选择。 它是一个体积小巧但功能强大的Windows工具软件&#xff0c;能够批量给多个PDF文件加密和限制&#xff0c;包括设置打印限制、禁止文字复制&#xff0c;并增加独立的打开密码。…...

【Unity 工程化】unity一些资源路径用途

Resources Resources 目录用于存放可以通过 Unity 的 Resources.Load 函数进行加载的资源。这些资源会在构建时被打包为一个单独的资源包&#xff0c;因此它们必须满足一些 Unity 所要求的命名和文件夹结构规则。由于这些资源被打包在一起&#xff0c;因此在构建后的游戏中可以…...

使用Docker进行模型部署

一、常见的模型部署场景 实时的、小数据量的预测应用 部署方式&#xff1a;采用python-httpserve应用部署&#xff08;如flask, fastApi, django&#xff09;&#xff0c;缺点是可能需要跨环境&#xff0c;从Java跨到Python环境实时的、大数据量的预测应用 部署方式&#xff1…...

第59步 深度学习图像识别:误判病例分析(TensorFlow)

基于WIN10的64位系统演示 一、写在前面 本期内容对等于机器学习二分类系列的误判病例分析&#xff08;传送门&#xff09;。既然前面的数据可以这么分析&#xff0c;那么图形识别自然也可以。 本期以mobilenet_v2模型为例&#xff0c;因为它建模速度快。 同样&#xff0c;基…...

【Vue框架】基本的login登录

前言 最近事情比较多&#xff0c;只能抽时间看了&#xff0c;放几天就把之前弄的都忘了&#xff0c;现在只挑着核心的部分看。现在铺垫了这么久&#xff0c;终于可以看前端最基本的登录了&#x1f602;。 1、views\login\index.vue 由于代码比较长&#xff0c;这里将vue和js…...

Python21天打卡Day16-内置方法map()

在 Python 中&#xff0c;map() 方法是一个内置的函数&#xff0c;用于将函数应用于可迭代对象&#xff08;如列表、元组等&#xff09;中的每个元素&#xff0c;返回一个包含结果的迭代器。 map() 方法的语法如下&#xff1a; map(function, iterable)function&#xff1a;表…...

伦敦银和伦敦金的区别

伦敦银河伦敦金并称贵金属交易市场的双璧&#xff0c;一般投资贵金属的投资者其实不是交易伦敦金就是交易伦敦银。相信经过一段时间的学习和投资&#xff0c;不少投资者都能分辨二者的区别。下面我们就来谈谈伦敦银和伦敦金有什么异同&#xff0c;他们在投资上是否有差别。 交易…...

【从零学习python 】92.使用Python的requests库发送HTTP请求和处理响应

文章目录 URL参数传递方式一&#xff1a;使用字典传递参数URL参数传递方式二&#xff1a;直接在URL中拼接参数获取响应头信息获取响应体数据a. 获取二进制数据b. 获取字符数据c. 获取JSON数据 进阶案例 URL参数传递方式一&#xff1a;使用字典传递参数 url https://www.apiop…...

Python requests实现图片上传接口自动化测试

最近帮别人写个小需求&#xff0c;需要本地自动化截图&#xff0c;然后图片自动化上传到又拍云&#xff0c;实现自动截图非常简单&#xff0c;在这里就不详细介绍了&#xff0c;主要和大家写下&#xff0c;如何通过Pythonrequests实现上传本地图片到又拍云服务器。 话不多说&a…...

【LeetCode-面试经典150题-day13】

目录 141.环形链表 2.两数相加 21.合并两个有序链表 138.复制带随机指针的链表 92.反转链表Ⅱ 141.环形链表 题意&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;…...

taro.js和nutui实现商品选择页面

1. 首先安装 Taro.js 和 NutUI: npm install -g tarojs/cli npm install taro-ui 2. 创建 Taro 项目并进入项目目录&#xff1a; taro init myapp cd myapp 3. 选用 Taro 模板一并安装依赖&#xff1a; npm install 4. 在页面目录中创建商品选择页&#xff1a; taro cre…...

数据结构--算法的时间复杂度和空间复杂度

文章目录 算法效率时间复杂度时间复杂度的概念大O的渐进表示法计算实例 时间复杂度实例 常见复杂度对比例题 算法效率 算法效率是指算法在计算机上运行时所消耗的时间和资源。这是衡量算法执行速度和资源利用情况的重要指标。 例子&#xff1a; long long Fib(int N) {if(N …...

Vue中使用element-plus中的el-dialog定义弹窗-内部样式修改-v-model实现-demo

效果图 实现代码 <template><el-dialog class"no-code-dialog" v-model"isShow" title"没有收到验证码&#xff1f;"><div class"nocode-body"><div class"tips">请尝试一下操作</div><d…...

MySQL 主从配置

环境 centos6.7 虚拟机两台 主&#xff1a;192.168.23.160 从&#xff1a;192.168.23.163 准备 在两台机器上分别安装mysql5.6.23&#xff0c;安装完成后利用临时密码登录mysql数据修改root的密码&#xff1b;将my.cnf配置文件放至/etc/my.cnf&#xff0c;重启mysql服务进…...

5分钟精通英雄联盟信息修改:LeaguePrank新手完全使用指南

5分钟精通英雄联盟信息修改&#xff1a;LeaguePrank新手完全使用指南 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否曾在英雄联盟中羡慕别人的华丽段位边框&#xff0c;却苦于自己的段位不够理想&#xff1f;你是否想要…...

从新手到认证专家:NotebookLM总结能力跃迁路径图(含Google官方未公开的评估矩阵V2.1)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM总结能力跃迁路径总览 NotebookLM 是 Google 推出的面向研究者与开发者的情境化 AI 助手&#xff0c;其核心突破在于将用户上传的文档&#xff08;PDF、TXT、Google Docs&#xff09;转化为可…...

NotebookLM赋能图书馆学研究:3大颠覆性应用+5个未公开工作流

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;NotebookLM赋能图书馆学研究&#xff1a;范式跃迁与学科再定义 传统图书馆学长期依托文献分类、编目规则与用户行为统计等静态分析范式&#xff0c;而NotebookLM作为Google推出的基于引用感知&#xff08;cita…...

避坑指南:LVGL Bar控件在RTOS和低内存MCU上的5个常见问题与解决方案

避坑指南&#xff1a;LVGL Bar控件在RTOS和低内存MCU上的5个常见问题与解决方案 在嵌入式开发中&#xff0c;LVGL作为轻量级图形库被广泛应用&#xff0c;但其Bar控件&#xff08;进度条&#xff09;在资源受限环境&#xff08;如FreeRTOS、内存<64KB的MCU&#xff09;下常出…...

QT无边框窗口实战:从圆角绘制到自定义标题栏与拖拽交互

1. 为什么需要无边框窗口&#xff1f; 现代桌面应用越来越注重视觉体验&#xff0c;传统的系统标题栏往往与整体设计风格格格不入。想象一下&#xff0c;你精心设计了一款深色主题的音乐播放器&#xff0c;顶部却突兀地挂着Windows默认的白色标题栏——这种割裂感正是无边框窗口…...

电子项目布线指南:从导线、电缆到连接器的核心选型与避坑

1. 项目概述&#xff1a;为什么“线”比“电路”本身更重要&#xff1f;干了十几年电子项目&#xff0c;从学生时代的第一个闪烁LED&#xff0c;到后来复杂的机器人系统和工业控制器&#xff0c;我踩过最多的坑&#xff0c;往往不是芯片选型或代码逻辑&#xff0c;而是那些看起…...

通过curl命令在无SDK环境中测试Taotoken接口连通性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过curl命令在无SDK环境中测试Taotoken接口连通性 在服务器管理、持续集成流水线或轻量级容器环境中&#xff0c;你可能需要在没有…...

充电桩源头厂家怎么选?五大核心维度教你精准选型

充电桩源头厂家怎么选&#xff1f;五大核心维度教你精准选型新能源充电基础设施建设进入高速发展期&#xff0c;物业、城投、能源企业、物流园区等采购方在选择充电桩源头厂家时&#xff0c;往往陷入“品牌多、难分辨、怕踩坑”的困境&#xff1a;贴牌组装产品质量无保障、小厂…...

修一个Bug,引入另一个Bug:从Tomcat高危漏洞看中间件安全修复的困境

攻击者无需认证&#xff0c;仅需向集群通信端口发送构造数据&#xff0c;即可绕过加密校验并触发反序列化&#xff0c;实现远程代码执行。这个漏洞的特殊之处在于——它是官方修复上一个漏洞时“顺手”引入的。2026年5月&#xff0c;Apache Tomcat官方披露了一个高危漏洞CVE-20…...

Translumo:5分钟掌握Windows实时屏幕翻译神器的完整指南

Translumo&#xff1a;5分钟掌握Windows实时屏幕翻译神器的完整指南 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo 你是否…...