springboot集成flyway自动创表的详细配置


Posted in Java/Android onJune 26, 2021

Flayway是一款数据库版本控制管理工具,,支持数据库版本自动升级,Migrations可以写成sql脚本,也可以写在java代码里;不仅支持Command Line和java api ,也支持Build构建工具和Spring boot,也可以在分布式环境下能够安全可靠安全地升级数据库,同时也支持失败恢复。

Flyway最核心的就是用于记录所有版本演化和状态的MetaData表,Flyway首次启动会创建默认名为SCHEMA_VERSION的元素局表。 表中保存了版本,描述,要执行的sql脚本等;

在ruoyi-admin这个module里面添加flyway依赖

<dependency>
      <groupId>org.flywaydb</groupId>
      <artifactId>flyway-core</artifactId>
  </dependency>
<!--   不是必须的 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>5.2.1</version>
            </plugin>
        </plugins>
    </build>

yml 配置flyway

spring:
    # 配置flyway数据版本管理
    flyway:
        enabled: true
        baseline-on-migrate: true
        clean-on-validation-error: false
        sql-migration-prefix: V
        sql-migration-suffixes: .sql
        locations: classpath:db/migration/mysql

配置sql脚本
在若依项目中的sql目录下有两个初始化sql脚本,在ruoyi-admin模块下的"resources/db/migration/mysql",命名为:Vx.x.x__ xxx.sql数据库文件。

springboot集成flyway自动创表的详细配置

一般的springboot项目进行到这里,flyway配置就完成了,不过ruoyi项目到这里启动的话,还是会报错,主要是有三个地方用到了@PostConstruct注解,系统需要从数据库中加载配置信息,并且是构造bean后就执行,此时flaway的数据库配置加载还没执行,如果是第一次执行项目的话,数据库都还没有表结构信息,所以会报错。
直接改若依项目项目启动是加载到缓存的配置的这三个地方的加载时机就行了。
首先,注释掉三个地方的配置加载。
ruoyi-systemcom.ruoyi.system.service.impl.SysConfigServiceImpl的参数缓存配置

springboot集成flyway自动创表的详细配置

ruoyi-systemcom.ruoyi.system.service.impl.SysDictTypeServiceImpl的字典信息缓存配置

springboot集成flyway自动创表的详细配置

ruoyi-quartzcom.ruoyi.quartz.service.impl.SysJobServiceImpl的定时任务配置

springboot集成flyway自动创表的详细配置

ruoyi-system中新增一个配置类com.ruoyi.system.config.RuntimeConfig,内容如下,在项目加载完成后flyaway加载完成后再执行这些参数的缓存配置。

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 *
  * @author: 云诺
  * @date: 2021/6/25
  * @description: 将项目启动后flyway创建好表加载到缓存
 */
@Component
public class RuntimeConfig implements ApplicationListener<ContextRefreshedEvent> {

    private final static Logger LOGGER = LoggerFactory.getLogger(RuntimeConfig.class);

    @Autowired
    private SysConfigMapper configMapper;


    @Autowired
    private SysDictTypeMapper dictTypeMapper;

    @Autowired
    private SysDictDataMapper dictDataMapper;

    @Autowired
    private Scheduler scheduler;

    @Autowired
    private SysJobMapper jobMapper;

    /**
     * 项目启动时,初始化参数
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        LOGGER.info("init Param ...");
        this.initParam();
        LOGGER.info("init dict ...");
        this.initDict();
        try {
            LOGGER.info("init job ...");
            this.initJob();
        } catch (SchedulerException e) {
            e.printStackTrace();
        } catch (TaskException e) {
            e.printStackTrace();
        }
    }

    /**
     * 初始化定时任务信息到缓存
     *
     * @throws SchedulerException
     * @throws TaskException
     */
    public void initJob() throws SchedulerException, TaskException {
        scheduler.clear();
        List<SysJob> jobList = jobMapper.selectJobAll();
        for (SysJob job : jobList) {
            ScheduleUtils.createScheduleJob(scheduler, job);
        }
    }



    /**
     * 初始化参数到缓存
     */
    public void initParam() {
        List<SysConfig> configsList = configMapper.selectConfigList(new SysConfig());
        for (SysConfig config : configsList)
        {
            CacheUtils.put(getCacheName(), getCacheKey(config.getConfigKey()), config.getConfigValue());
        }
    }

    /**
     * 初始化字典到缓存
     */
    public void initDict() {
        List<SysDictType> dictTypeList = dictTypeMapper.selectDictTypeAll();
        for (SysDictType dictType : dictTypeList)
        {
            List<SysDictData> dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType());
            DictUtils.setDictCache(dictType.getDictType(), dictDatas);
        }
    }

    /**
     * 设置cache key
     *
     * @param configKey 参数键
     * @return 缓存键key
     */
    private String getCacheKey(String configKey)
    {
        return Constants.SYS_CONFIG_KEY + configKey;
    }
    
    /**
     * 获取cache name
     *
     * @return 缓存名
     */
    private String getCacheName()
    {
        return Constants.SYS_CONFIG_CACHE;
    }
}

到这里就可以正常启动项目了

以上就是springboot集成flyway自动创表的详细内容,更多关于springboot自动创表的资料请关注三水点靠木其它相关文章!

Java/Android 相关文章推荐
Win10系统下配置Java环境变量
Jun 13 Java/Android
SpringBoot工程下使用OpenFeign的坑及解决
Jul 02 Java/Android
详细了解java监听器和过滤器
Jul 09 Java/Android
Log4j.properties配置及其使用
Aug 02 Java/Android
关于springboot配置druid数据源不生效问题(踩坑记)
Sep 25 Java/Android
SpringDataJPA在Entity中常用的注解介绍
Dec 06 Java/Android
JavaCV实现照片马赛克效果
Jan 22 Java/Android
mybatis源码解读之executor包语句处理功能
Feb 15 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
Java详细解析==和equals的区别
Apr 07 Java/Android
Java 异步任务计算FutureTask
Apr 28 Java/Android
HttpClient实现表单提交上传文件
Aug 14 Java/Android
idea搭建可运行Servlet的Web项目
Java Dubbo框架知识点梳理
Java实现多线程聊天室
eclipse创建项目没有dynamic web的解决方法
Feign调用传输文件异常的解决
springcloud之Feign超时问题的解决
Feign调用全局异常处理解决方案
You might like
使用Apache的rewrite技术
2006/06/22 PHP
php中http_build_query 的一个问题
2012/03/25 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
CentOS 上搭建 PHP7 开发测试环境
2017/02/26 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
AJAX架构之Dojo篇
2007/04/10 Javascript
JavaScript类和继承 this属性使用说明
2010/09/03 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
jquery slibings选取同级其他元素的实现代码
2013/11/15 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
解析vue中的$mount
2017/12/21 Javascript
简述vue中的config配置
2018/01/23 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
js中延迟加载和预加载的具体使用
2021/01/14 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
python使用paramiko实现远程拷贝文件的方法
2016/04/18 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
关于python字符串方法分类详解
2019/08/20 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
Python matplotlib画图时图例说明(legend)放到图像外侧详解
2020/05/16 Python
Python多分支if语句的使用
2020/09/03 Python
Python基于locals返回作用域字典
2020/10/17 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
利用canvas实现图片压缩的示例代码
2018/07/17 HTML / CSS
模具专业推荐信
2013/10/30 职场文书
《故乡》教学反思
2014/04/10 职场文书
涨价通知
2015/04/23 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python