liquibase customChange
liquibase customChange
liquibase changeset 执行Java代码。
liquibase支持yml等文件,支持引入sql文件,还支持Java这种方式执行change。
对于执行 DDL DML 使用sql很方便,但是我想执行一些数据处理,将几个表中的数据放到新建的表中,那么就需要写存储过程。liquibase文档中支持使用存储过程,但是他也支持使用customChange来使用Java代码。
先说sql文件的使用
maven:
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
application.yml
spring:
liquibase:
change-log: classpath:db/changelog/db.changelog-master.yml
enabled: true
----------------------------
spring数据库相关的配置 .......
目录结构

db.changelog-master.yml文件部分内容
databaseChangeLog:
- preConditions:
- dbms:
type: mysql
- runningAs:
username: root
- changeSet:
id: 202308081722
author: keboom
changes:
- sqlFile:
dbms: mysql
endDelimiter: ";"
encoding: "UTF-8"
path: classpath:/db/changelog/changes/add_board_manager.sql
- changeSet:
id: 202308090949
author: keboom
changes:
- sqlFile:
dbms: mysql
endDelimiter: ";"
encoding: "UTF-8"
path: classpath:/db/changelog/changes/dest_device_table_add_isSDI_column.sql
然后启动项目即可使用。
再说Java文件的使用
在db.changelog-master.yml文件新添加:
- changeSet:
id: 202308111016
author: keboom
changes:
- customChange: { "class": "com.example.web.changelog.InitRouteDestRel" }
InitRouteDestRel 类如下:
public class InitRouteDestRel implements CustomTaskChange {
@Override
public void execute(Database database) throws CustomChangeException {
ApplicationContext context = ApplicationContextProvider.getApplicationContext();
RouteDao routeDao = context.getBean(RouteDao.class);
RouteDestRelDao routeDestRelDao = context.getBean(RouteDestRelDao.class);
List<Route> routeList = routeDao.list();
LinkedList<RouteDestRelDO> insertCollections = new LinkedList<>();
for (Route route : routeList) {
String destIds = route.getDestIds();
if (StringUtils.isEmpty(destIds)) {
continue;
}
String[] destArr = StringUtils.split(destIds, ",");
for (String s : destArr) {
RouteDestRelDO routeDestRelDO = new RouteDestRelDO(route.getId(), Integer.valueOf(s));
insertCollections.add(routeDestRelDO);
}
}
routeDestRelDao.saveBatch(insertCollections);
}
@Override
public String getConfirmationMessage() {
return null;
}
@Override
public void setUp() throws SetupException {
}
@Override
public void setFileOpener(ResourceAccessor resourceAccessor) {
}
@Override
public ValidationErrors validate(Database database) {
return null;
}
}
在execute方法里面执行要做的操作即可。但是liquibase这个是不归springboot管的,里面用各种注解,还是什么构造器注入都不行。我们可以通过获得ApplicationContext来获得想要的 dao 类。
参考:https://www.baeldung.com/spring-get-current-applicationcontext
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* {@code @author:} keboom
* {@code @date:} 2023/8/11
* {@code @description:}
*/
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextProvider.applicationContext = applicationContext;
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
}
参考:
stackoverflow-use other spring beans in liquibase customtaskchange
liquibase customChange的更多相关文章
- liquibase的使用
前言 liquibase是一个数据库持续集成插件.独立于数据库存在,oracle,mysql,db2,h2,sql server,postgresql都能使用.它使用配置文件来更新数据库结构,并加入版 ...
- Spring3+Mybatis3+Mysql+ivy+liquibase
Spring3+Mybatis3+Mysql+ivy+liquibase 集成 近一周时间所学技术:整合Spring+MyBatis+MySql+ivy+liquibase Mybatis:是一个基于 ...
- liquibase之快速入门
第一步: 创建一个Changelog File: 这个database Changelog file列举了数据库中所有的改变情况,该文件是以xml为基础的,下面是一个空的xml文件: <?xm ...
- Liquibase的简单使用
LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态.它的目标是提供一种数据库类型无关的解决方案,通过执 ...
- [心得] 如何利用liquibase進行資料庫版本控制 - 實際練習
透過上一篇的基本觀念介紹,希望大家應該有一點點感覺了! 這篇我們就來做個簡單的版本演練,加深印象吧! 我使用的環境如下 System : Windows 7 Database : SQL Server ...
- flyway和liquibase的使用样例
在代码上我们有svn和git等诸多的版本控制方法. 但是在数据库上却没有相应的工具.一度导致多环境见的数据库同步难以维持. flyway和liquibase都是常见的数据库版本控制工具. flyway ...
- [心得] 如何利用liquibase進行資料庫版本控制 - 基礎觀念
前言 - 會寫這篇除了是要記錄一下使用的過程之外,也是發現到網路上找來的教學幾乎都是跟其它環境做結合 比較沒有單純利用command進行的流程.也沒有整體觀念的介紹,所以將我所理解的整理分享給大家. ...
- LiquiBase 学习
preconditions mysql database is installed maven has been setted up properly add depedenceies apply p ...
- Liquibase使用入门
1.LiquiBase简介 LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态.LiquiBase的主 ...
- eclipse liquibase 插件
http://marketplace.eclipse.org/category/free-tagging/liquibase http://marketplace.eclipse.org/market ...
随机推荐
- c++基础之字符串、向量和数组
上一次整理完了<c++ primer>的第二章的内容.这次整理本书的第3章内容. 这里还是声明一下,我整理的主要是自己不知道的或者需要注意的内容,以我本人的主观意志为准,并不具备普适性. ...
- Python库【数据处理、机器学习、大数据、文件处理等14个类的所有python库整理】
吐血整理一个月--终于把所有Python库整理齐了....._小熊猫爱恰饭的博客-CSDN博客 参考链接: 一.数据处理 #python学习资料群:660193417 ##3 Chardet # 字符 ...
- C/C++ 通过CRC32实现反破解
我们可以通过使用CRC32算法计算出程序的CRC字节,并将其写入到PE文件的空缺位置,这样当程序再次运行时,来检测这个标志,是否与计算出来的标志一致,来决定是否运行程序,一旦程序被打补丁,其crc32 ...
- npm查看插件所有版本命令
npm view webpack versions npm view webpack versions
- Java注解支持的类型
我们经常会自定义注解,自定义注解时,可能会需要定义各种数据类型,但是自定义注解可以包含哪些数据类型,是存在限制的. 主要有如下几种: A primitive type : 基本类型(java的八种基本 ...
- Jackson objectMapper.readValue 方法 详解
直接说结论方便一目了然: 1. 简单的直接Bean.class 2. 复杂的用 TypeReference 这样就完事了. public class TestMain2 { public static ...
- FDConnection的事务测试讲解。。
总之用事务的宗旨是: 1.不用嵌套事务EnableNested设置为False 2.事务一定要回滚,避免发生异常的情况下,没有回滚 造成,不可估量的错误. try frmClientDm.MyMain ...
- 使用BP神经网络实现函数逼近
1 一元函数逼近 1.1 待逼近函数 1.2 代码 clear,clc p=[-4:0.1:4]; %神经网络输入值 t=sin(0.5*pi*p)+sin(pi*p); %神经网络目标值 n=15; ...
- MySQL Boolean类型的坑
MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型. 而SQLAlchemy生成SQL的时候并没有检测到 这一点,这就导致一个问题,当使用 ...
- Windows Docker Destop修改默认镜像文件位置
0.首先关闭docker destop. 1.通过Everything或者资源管理器找到以.vhdx结尾的文件所在的位置,这些就是docker镜像路径 2.我的路径:C:\Users\Administ ...