liquibase customChange

liquibase changeset 执行Java代码。

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

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

customChange

先说sql文件的使用

maven:

  1. <dependency>
  2. <groupId>org.liquibase</groupId>
  3. <artifactId>liquibase-core</artifactId>
  4. </dependency>

application.yml

  1. spring:
  2. liquibase:
  3. change-log: classpath:db/changelog/db.changelog-master.yml
  4. enabled: true
  5. ----------------------------
  6. spring数据库相关的配置 .......

目录结构

db.changelog-master.yml文件部分内容

  1. databaseChangeLog:
  2. - preConditions:
  3. - dbms:
  4. type: mysql
  5. - runningAs:
  6. username: root
  7. - changeSet:
  8. id: 202308081722
  9. author: keboom
  10. changes:
  11. - sqlFile:
  12. dbms: mysql
  13. endDelimiter: ";"
  14. encoding: "UTF-8"
  15. path: classpath:/db/changelog/changes/add_board_manager.sql
  16. - changeSet:
  17. id: 202308090949
  18. author: keboom
  19. changes:
  20. - sqlFile:
  21. dbms: mysql
  22. endDelimiter: ";"
  23. encoding: "UTF-8"
  24. path: classpath:/db/changelog/changes/dest_device_table_add_isSDI_column.sql

然后启动项目即可使用。

再说Java文件的使用

在db.changelog-master.yml文件新添加:

  1. - changeSet:
  2. id: 202308111016
  3. author: keboom
  4. changes:
  5. - customChange: { "class": "com.example.web.changelog.InitRouteDestRel" }

InitRouteDestRel 类如下:

  1. public class InitRouteDestRel implements CustomTaskChange {
  2. @Override
  3. public void execute(Database database) throws CustomChangeException {
  4. ApplicationContext context = ApplicationContextProvider.getApplicationContext();
  5. RouteDao routeDao = context.getBean(RouteDao.class);
  6. RouteDestRelDao routeDestRelDao = context.getBean(RouteDestRelDao.class);
  7. List<Route> routeList = routeDao.list();
  8. LinkedList<RouteDestRelDO> insertCollections = new LinkedList<>();
  9. for (Route route : routeList) {
  10. String destIds = route.getDestIds();
  11. if (StringUtils.isEmpty(destIds)) {
  12. continue;
  13. }
  14. String[] destArr = StringUtils.split(destIds, ",");
  15. for (String s : destArr) {
  16. RouteDestRelDO routeDestRelDO = new RouteDestRelDO(route.getId(), Integer.valueOf(s));
  17. insertCollections.add(routeDestRelDO);
  18. }
  19. }
  20. routeDestRelDao.saveBatch(insertCollections);
  21. }
  22. @Override
  23. public String getConfirmationMessage() {
  24. return null;
  25. }
  26. @Override
  27. public void setUp() throws SetupException {
  28. }
  29. @Override
  30. public void setFileOpener(ResourceAccessor resourceAccessor) {
  31. }
  32. @Override
  33. public ValidationErrors validate(Database database) {
  34. return null;
  35. }
  36. }

在execute方法里面执行要做的操作即可。但是liquibase这个是不归springboot管的,里面用各种注解,还是什么构造器注入都不行。我们可以通过获得ApplicationContext来获得想要的 dao 类。

参考:https://www.baeldung.com/spring-get-current-applicationcontext

  1. import org.springframework.beans.BeansException;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.ApplicationContextAware;
  4. import org.springframework.stereotype.Component;
  5. /**
  6. * {@code @author:} keboom
  7. * {@code @date:} 2023/8/11
  8. * {@code @description:}
  9. */
  10. @Component
  11. public class ApplicationContextProvider implements ApplicationContextAware {
  12. private static ApplicationContext applicationContext;
  13. @Override
  14. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  15. ApplicationContextProvider.applicationContext = applicationContext;
  16. }
  17. public static ApplicationContext getApplicationContext() {
  18. return applicationContext;
  19. }
  20. }

参考:

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. AsNoTracking()非跟踪数据 查询

    刚开始学习使用EF ,做项目时需要查询数据将数据显示在datagrid中,使用如下方法: query是IQueryable的 在一次看别人写的代码的时候,发现了AsNoTracking()这个方法,并 ...

  2. 【1】Anaconda安装超简洁教程,配置环境、创建虚拟环境、添加镜像源

    相关文章: [1]Anaconda安装超简洁教程,瞬间学会! [2]Anaconda下:ipython文件的打开方式,Jupyter Notebook中运行.py文件,快速打开ipython文件的方法 ...

  3. C/C++ 反汇编:流程控制与循环结构

    反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高级语言代码都有相当大的帮助, ...

  4. 基于.NET+FreeSql实现的仿掘金专栏前后端分离的CMS

    前言 今天分享一款基于.NET+FreeSql实现的仿掘金专栏前后端分离.支持Docker部署.集成了OAtuh2授权登录.QQ.Github.Gitee快速登录.简单实用的CMS:lin-cms-d ...

  5. 基于客户真实使用场景的云剪辑Timeline问题解答与代码实操

    本文为阿里云智能媒体服务IMS「云端智能剪辑」实践指南第6期,从客户真实实践场景出发,分享一些Timeline小技巧(AI_TTS.主轨道.素材对齐),助力客户降低开发时间与成本. 欧叔|作者 故事的 ...

  6. delphi IDE 控件居中的方法

  7. Kafka-常用命令行命令(Kafak3.4.0最新命令)

    第一章 Kafka常用命令 1. Topic(主题) 1.1. 创建Topic bin/kafka-topics.sh --create --bootstrap-server hadoop01:909 ...

  8. [Redis] Redis的三大缓存异常原因分析和解决方案

    Redis的三大缓存异常原因分析和解决方案 缓存的三个异常分别是缓存击穿.缓存雪崩.缓存穿透.这三个问题一旦发生,会导致大量的请求积压到数据库层,并发量巨大的情况下很有可能导致数据库宕机或是故障,造成 ...

  9. 线性SVM决策过程的可视化

    线性 SVM 决策过程的可视化 导入模块 from sklearn.datasets import make_blobs from sklearn.svm import SVC import matp ...

  10. Python def() 后的-> 符号的作用

    python – 定义函数 def 后面的 ->,:表示的含义-> 常常出现在python函数定义的函数名后面,为函数添加元数据,描述函数返回的类型. : 表示参数的类型建议符示例: de ...