liquibase customChange

liquibase changeset 执行Java代码。

liquibase支持yml等文件,支持引入sql文件,还支持Java这种方式执行change。

对于执行 DDL DML 使用sql很方便,但是我想执行一些数据处理,将几个表中的数据放到新建的表中,那么就需要写存储过程。liquibase文档中支持使用存储过程,但是他也支持使用customChange来使用Java代码。

customChange

先说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的更多相关文章

  1. liquibase的使用

    前言 liquibase是一个数据库持续集成插件.独立于数据库存在,oracle,mysql,db2,h2,sql server,postgresql都能使用.它使用配置文件来更新数据库结构,并加入版 ...

  2. Spring3+Mybatis3+Mysql+ivy+liquibase

    Spring3+Mybatis3+Mysql+ivy+liquibase 集成 近一周时间所学技术:整合Spring+MyBatis+MySql+ivy+liquibase Mybatis:是一个基于 ...

  3. liquibase之快速入门

    第一步: 创建一个Changelog File: 这个database  Changelog file列举了数据库中所有的改变情况,该文件是以xml为基础的,下面是一个空的xml文件: <?xm ...

  4. Liquibase的简单使用

    LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态.它的目标是提供一种数据库类型无关的解决方案,通过执 ...

  5. [心得] 如何利用liquibase進行資料庫版本控制 - 實際練習

    透過上一篇的基本觀念介紹,希望大家應該有一點點感覺了! 這篇我們就來做個簡單的版本演練,加深印象吧! 我使用的環境如下 System : Windows 7 Database : SQL Server ...

  6. flyway和liquibase的使用样例

    在代码上我们有svn和git等诸多的版本控制方法. 但是在数据库上却没有相应的工具.一度导致多环境见的数据库同步难以维持. flyway和liquibase都是常见的数据库版本控制工具. flyway ...

  7. [心得] 如何利用liquibase進行資料庫版本控制 - 基礎觀念

    前言 - 會寫這篇除了是要記錄一下使用的過程之外,也是發現到網路上找來的教學幾乎都是跟其它環境做結合 比較沒有單純利用command進行的流程.也沒有整體觀念的介紹,所以將我所理解的整理分享給大家. ...

  8. LiquiBase 学习

    preconditions mysql database is installed maven has been setted up properly add depedenceies apply p ...

  9. Liquibase使用入门

    1.LiquiBase简介 LiquiBase是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态.LiquiBase的主 ...

  10. eclipse liquibase 插件

    http://marketplace.eclipse.org/category/free-tagging/liquibase http://marketplace.eclipse.org/market ...

随机推荐

  1. c++基础之字符串、向量和数组

    上一次整理完了<c++ primer>的第二章的内容.这次整理本书的第3章内容. 这里还是声明一下,我整理的主要是自己不知道的或者需要注意的内容,以我本人的主观意志为准,并不具备普适性. ...

  2. Python库【数据处理、机器学习、大数据、文件处理等14个类的所有python库整理】

    吐血整理一个月--终于把所有Python库整理齐了....._小熊猫爱恰饭的博客-CSDN博客 参考链接: 一.数据处理 #python学习资料群:660193417 ##3 Chardet # 字符 ...

  3. C/C++ 通过CRC32实现反破解

    我们可以通过使用CRC32算法计算出程序的CRC字节,并将其写入到PE文件的空缺位置,这样当程序再次运行时,来检测这个标志,是否与计算出来的标志一致,来决定是否运行程序,一旦程序被打补丁,其crc32 ...

  4. npm查看插件所有版本命令

    npm view webpack versions npm view webpack versions

  5. Java注解支持的类型

    我们经常会自定义注解,自定义注解时,可能会需要定义各种数据类型,但是自定义注解可以包含哪些数据类型,是存在限制的. 主要有如下几种: A primitive type : 基本类型(java的八种基本 ...

  6. Jackson objectMapper.readValue 方法 详解

    直接说结论方便一目了然: 1. 简单的直接Bean.class 2. 复杂的用 TypeReference 这样就完事了. public class TestMain2 { public static ...

  7. FDConnection的事务测试讲解。。

    总之用事务的宗旨是: 1.不用嵌套事务EnableNested设置为False 2.事务一定要回滚,避免发生异常的情况下,没有回滚 造成,不可估量的错误. try frmClientDm.MyMain ...

  8. 使用BP神经网络实现函数逼近

    1 一元函数逼近 1.1 待逼近函数 1.2 代码 clear,clc p=[-4:0.1:4]; %神经网络输入值 t=sin(0.5*pi*p)+sin(pi*p); %神经网络目标值 n=15; ...

  9. MySQL Boolean类型的坑

    MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型. 而SQLAlchemy生成SQL的时候并没有检测到 这一点,这就导致一个问题,当使用 ...

  10. Windows Docker Destop修改默认镜像文件位置

    0.首先关闭docker destop. 1.通过Everything或者资源管理器找到以.vhdx结尾的文件所在的位置,这些就是docker镜像路径 2.我的路径:C:\Users\Administ ...