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 相关文章推荐
详解JAVA中的OPTIONAL
Jun 14 Java/Android
SpringBoot整合JWT的入门指南
Jun 29 Java/Android
mybatis 获取无数据的字段不显示的问题
Jul 15 Java/Android
JavaWeb 入门篇(3)ServletContext 详解 具体应用
Jul 16 Java/Android
Java org.w3c.dom.Document 类方法引用报错
Aug 07 Java/Android
Java中Quartz高可用定时任务快速入门
Apr 03 Java/Android
Java中的继承、多态以及封装
Apr 11 Java/Android
Android自定义双向滑动控件
Apr 19 Java/Android
Android开发实现极为简单的QQ登录页面
Apr 24 Java/Android
Java由浅入深通关抽象类与接口(下篇)
Apr 26 Java/Android
Java 多态分析
Apr 26 Java/Android
Java 数组的使用
May 11 Java/Android
idea搭建可运行Servlet的Web项目
Java Dubbo框架知识点梳理
Java实现多线程聊天室
eclipse创建项目没有dynamic web的解决方法
Feign调用传输文件异常的解决
springcloud之Feign超时问题的解决
Feign调用全局异常处理解决方案
You might like
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
php实现博客,论坛图片防盗链的方法
2016/10/15 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
angular实现form验证实例代码
2017/01/17 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
2019/07/04 jQuery
js实现时钟定时器
2020/03/26 Javascript
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
在Python中使用异步Socket编程性能测试
2014/06/25 Python
使用SAE部署Python运行环境的教程
2015/05/05 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
python写入并获取剪切板内容的实例
2018/05/31 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
Python按钮的响应事件详解
2019/03/04 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
法学研究生自我鉴定范文
2013/12/04 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android