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 相关文章推荐
自从在 IDEA 中用了热部署神器 JRebel 之后,开发效率提升了 10(真棒)
Jun 26 Java/Android
Spring Boot 启动、停止、重启、状态脚本
Jun 26 Java/Android
springboot集成springCloud中gateway时启动报错的解决
Jul 16 Java/Android
Java数据开发辅助工具Docker与普通程序使用方法
Sep 15 Java/Android
Java8中Stream的一些神操作
Nov 02 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Spring Data JPA框架持久化存储数据到数据库
Apr 28 Java/Android
ConditionalOnProperty配置swagger不生效问题及解决
Jun 14 Java/Android
Android基础入门之dataBinding的简单使用教程
Jun 21 Java/Android
SpringBoot项目部署到阿里云服务器的实现步骤
Jun 28 Java/Android
java实现web实时消息推送的七种方案
Jul 23 Java/Android
Java中的Kafka为什么性能这么快及4大核心详析
Sep 23 Java/Android
idea搭建可运行Servlet的Web项目
Java Dubbo框架知识点梳理
Java实现多线程聊天室
eclipse创建项目没有dynamic web的解决方法
Feign调用传输文件异常的解决
springcloud之Feign超时问题的解决
Feign调用全局异常处理解决方案
You might like
PHP网站基础优化方法小结
2008/09/29 PHP
PHP常用技巧总结(附函数代码)
2012/02/04 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
php解析xml方法实例详解
2015/05/12 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
php微信开发之谷歌测距
2018/06/14 PHP
关于js类的定义
2011/06/28 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
JavaScript标准对象_动力节点Java学院整理
2017/06/27 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
Vue实现active点击切换方法
2018/03/16 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
2020/11/11 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
[01:13]2014DOTA2西雅图邀请赛 舌尖上的TI4
2014/07/08 DOTA
python cookielib 登录人人网的实现代码
2012/12/19 Python
python使用opencv进行人脸识别
2017/04/07 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
python tornado使用流生成图片的例子
2019/11/18 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
Python如何操作docker redis过程解析
2020/08/10 Python
中专三年学习的个人自我评价
2013/12/12 职场文书
学校安全教育月活动总结
2014/07/07 职场文书
岗位聘任报告
2015/03/02 职场文书
在校生证明
2015/06/17 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python