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常用工具类汇总 附示例代码
Jun 26 Java/Android
SpringBoot整合RabbitMQ的5种模式实战
Aug 02 Java/Android
java代码实现空间切割
Jan 18 Java/Android
使用HttpSessionListener监听器实战
Mar 17 Java/Android
零基础学java之方法的定义与调用详解
Apr 10 Java/Android
JavaWeb Servlet开发注册页面实例
Apr 11 Java/Android
Java处理延时任务的常用几种解决方案
Jun 01 Java/Android
Android中View.post和Handler.post的关系
Jun 05 Java/Android
Java 中的 Lambda List 转 Map 的多种方法详解
Jul 07 Java/Android
Spring boot admin 服务监控利器详解
Aug 05 Java/Android
HttpClient实现文件上传功能
Aug 14 Java/Android
Java结构型设计模式之组合模式详解
Sep 23 Java/Android
idea搭建可运行Servlet的Web项目
Java Dubbo框架知识点梳理
Java实现多线程聊天室
eclipse创建项目没有dynamic web的解决方法
Feign调用传输文件异常的解决
springcloud之Feign超时问题的解决
Feign调用全局异常处理解决方案
You might like
PHP安全编程之加密功能
2006/10/09 PHP
用函数读出数据表内容放入二维数组
2006/10/09 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
JQuery CSS样式控制 学习笔记
2009/07/23 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
jQuery通过deferred对象管理ajax异步
2016/05/20 Javascript
JS简单实现禁止访问某个页面的方法
2016/09/13 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
python开发简易版在线音乐播放器
2017/03/03 Python
python中字符串内置函数的用法总结
2018/09/13 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
Python环境Pillow( PIL )图像处理工具使用解析
2019/09/12 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
python连接mongodb集群方法详解
2020/02/13 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
外语专业毕业生自我评价分享
2013/10/05 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
军训生自我鉴定范文
2013/12/27 职场文书
2015年清明节演讲稿范文
2015/03/17 职场文书
个人合作协议范本
2015/08/06 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书