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. 时不我待,拥抱趋势,开源IM项目OpenIM技术简介

    坚持开源 开源的理念是基于共享.合作和透明的原则,将软件.代码等知识资源公开并允许他人使用.修改和重新分发,以促进创新和发展.以下是几个开源的优点: 创新:开源可以促进创新,通过让其他人改进或扩展已有 ...

  2. 5.0 Python 定义并使用函数

    函数是python程序中的基本模块化单位,它是一段可重用的代码,可以被多次调用执行.函数接受一些输入参数,并且在执行时可能会产生一些输出结果.函数定义了一个功能的封装,使得代码能够模块化和组织结构化, ...

  3. Python 排序与查找算法收集

    Python 语言实现几种不同的排序算法,代码来自于老男孩Python全栈开发,学习教程! import random import time import copy import sys def c ...

  4. PE格式:实现ELF结构解析工具

    ELF文件格式,是一个开放的可执行文件和链接文件格式,其主要工作在Linux系统上,是一种用于二进制文件.可执行文件.目标代码.共享库和核心转储格式文件,ELF文件格式类似于PE格式,但比起PE结构来 ...

  5. 【STL源码剖析】string类模拟实现 了解底层-走进底层-掌握底层【超详细的注释和解释】

    文章目录 博主对大家的话 前言 实现过程一些要注意的点 STL中string类模拟实现 尾声 博主对大家的话 从今天开始,STL源码剖析的专栏就正式上线了!其实在很多人学习C++过程中,都是只学习一些 ...

  6. P2216 [HAOI2007] 理想的正方形 题解

    题目链接:理想的正方形 比较明显的,我们可以用二维 ST 表解决,具体的二维 ST 表的实现,只需要知道一点: 对于 \(st[i][j][t]=max(i \sim i+2^t,j \sim j+2 ...

  7. Oracle 19c RAC自动应用RU补丁过程

    笔者好久没有使用opatchauto打过补丁了,搜了下自己的历史随笔,上次opatchauto打补丁的记录还是Oracle 11g版本: Oracle 11g RAC 自动应用PSU补丁简明版 而11 ...

  8. Java微服务SpringCloud+Uniapp+Vue3+Element Plus开源BizSpring商城

    产品介绍 BizSpring电商平台概述 BizSpring电商平台,是基于最新Spring Cloud 微服务架构开发的多语言电商平台,使用领先的 Vue3.0+ElementPlus + unia ...

  9. .NET应用程序7种最常见的性能问题及其解决方案

    译者注:这篇文章依然是介绍.NET Framework框架下的性能问题排查,可能并不直接适用于.NET Core,但有时也能提供一些参考.   .NET应用程序7种最常见的性能问题及其解决方案 原文地 ...

  10. JS Leetcode 503. 下一个更大元素 II 题解分析,依旧单调栈做法解决此题

    壹 ❀ 引 我在JS Leetcode 496. 下一个更大元素 I 更清晰的图解单调栈做法一文中,介绍了单调栈做法解决下一个更大元素的问题,比较巧的是这道题还有升级版,题目来自Leetcode503 ...