51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Springboot整合Flyway自动管理数据库变更

以若依项目为例(v3.8.4) {#%E4%BB%A5%E8%8B%A5%E4%BE%9D%E9%A1%B9%E7%9B%AE%E4%B8%BA%E4%BE%8B(v3.8.4)}

1、 pom.xml(ruoyi) 引入依赖管理 {#1%E3%80%81-pom.xml(ruoyi)-%E5%BC%95%E5%85%A5%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86}

    <dependencyManagement>
        <dependencies>
 			<dependency>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-core</artifactId>
                <version>${flyway.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

2、 pom.xml(ruoyi-admin).xml引入依赖 {#2%E3%80%81-pom.xml(ruoyi-admin).xml%E5%BC%95%E5%85%A5%E4%BE%9D%E8%B5%96}

    <dependencies>
    <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>
    </dependencies>

3、 resources目录下新建db/migration目录 来存放sql脚本 {#3%E3%80%81-resources%E7%9B%AE%E5%BD%95%E4%B8%8B%E6%96%B0%E5%BB%BAdb%2Fmigration%E7%9B%AE%E5%BD%95-%E6%9D%A5%E5%AD%98%E6%94%BEsql%E8%84%9A%E6%9C%AC}

wxy_2022-12-09_10-46-07

版本1.0.0中放入初始化sql脚本
版本1.0.1中放入测试脚本

# 创建flyway_test 并插入一条数据
DROP TABLE IF EXISTS `cpt_monitor`.`flyway_test`;
CREATE TABLE `cpt_monitor`.`flyway_test`
(
    `id`          int      NOT NULL AUTO_INCREMENT,
    `update_time` datetime NULL,
    PRIMARY KEY (`id`)
);
`insert into ``cpt_monitor``.``flyway_test``
values (1, now());
`

4、 在application.yml中配置 {#4%E3%80%81-%E5%9C%A8application.yml%E4%B8%AD%E9%85%8D%E7%BD%AE}

spring
  flyway:
    # 是否启用flyway
    enabled: true
    # 编码格式,默认UTF-8
    encoding: UTF-8
    # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
    baseline-on-migrate: true

配置好数据库链接,空数据库即可。正常情况下此时启动 便会在数据中执行初始化sql 和 测试sql 两个版本按顺序,并自动生成flyway_schema_history表来记录版本;

5、 若依项目(v3.8.4)还需要额外增加配置 {#5%E3%80%81-%E8%8B%A5%E4%BE%9D%E9%A1%B9%E7%9B%AE(v3.8.4)%E8%BF%98%E9%9C%80%E8%A6%81%E9%A2%9D%E5%A4%96%E5%A2%9E%E5%8A%A0%E9%85%8D%E7%BD%AE}

主要是有两个地方用到了@PostConstruct注解,系统需要从数据库中加载配置信息,并且是构造bean后就执行,此时flaway的数据库配置加载还没执行,如果是第一次执行项目的话,数据库都还没有表结构信息,所以会报错。
此时可以考虑重写flyway自动配置,通过@Bean的方式添加,不采用默认的自动化配置,控制表信息的加载时机。更方便的,直接改这两个地方的加载时机就行了。

1 、找到这两个配置类,注释掉初始化; {#1-%E3%80%81%E6%89%BE%E5%88%B0%E8%BF%99%E4%B8%A4%E4%B8%AA%E9%85%8D%E7%BD%AE%E7%B1%BB%2C%E6%B3%A8%E9%87%8A%E6%8E%89%E5%88%9D%E5%A7%8B%E5%8C%96%3B}

  • ruoyi-system中com.ruoyi.system.service.impl.SysDictTypeServiceImpl的字典信息缓存配置
  • ruoyi-system中com.ruoyi.system.service.impl.SysConfigServiceImpl的redis参数缓存配置
    SysDictTypeServiceImpl.java
 /**
     * 项目启动时,初始化字典到缓存
     */
/*
    @PostConstruct
    public void init() {
        loadingDictCache();
    }
*/

SysConfigServiceImpl.java

    /**
     * 项目启动时,初始化参数到缓存
     */
/*    @PostConstruct
    public void init() {
        loadingConfigCache();
    }*/

2. 在若依system模块中新建conf/RuntimeConfig {#2.-%E5%9C%A8%E8%8B%A5%E4%BE%9Dsystem%E6%A8%A1%E5%9D%97%E4%B8%AD%E6%96%B0%E5%BB%BAconf%2Fruntimeconfig}

package com.ruoyi.system.config;

import com.ruoyi.system.service.impl.SysConfigServiceImpl;
import com.ruoyi.system.service.impl.SysDictTypeServiceImpl;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;


/\*\*




* 
  @Description 兼容flyway  把 项目初始化内容 改到这里初始化(改变加载时机)





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





* 
  ruoyi-system中com.ruoyi.system.service.impl.SysConfigServiceImpl的redis参数缓存配置





* 
  参考 https://blog.csdn.net/qq_41885819/article/details/114970148





* 
  @Author wxyShine





* 
  @Date 2022/12/9 9:37





* 
  @Email wxy@wxy97.com
  \*/
  @Component
  public class RuntimeConfig implements ApplicationListener\<ContextRefreshedEvent\> {



  private final SysConfigServiceImpl sysConfigServiceImpl;
  private final SysDictTypeServiceImpl sysDictTypeServiceImpl;


  public RuntimeConfig(SysConfigServiceImpl sysConfigServiceImpl,
  SysDictTypeServiceImpl sysDictTypeServiceImpl) {
  this.sysConfigServiceImpl = sysConfigServiceImpl;
  this.sysDictTypeServiceImpl = sysDictTypeServiceImpl;
  }


  /\*\*



  * 项目启动时,初始化参数
    */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
    sysConfigServiceImpl.loadingConfigCache();
    sysDictTypeServiceImpl.loadingDictCache();
    }





`}
`

此时已经整合完成。

配置Maven插件来使用Flyway {#%E9%85%8D%E7%BD%AEmaven%E6%8F%92%E4%BB%B6%E6%9D%A5%E4%BD%BF%E7%94%A8flyway}

在pom.xml(ruoyi)中增加如下

 <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
                <version>5.2.4</version>
                <configuration>
                    <url>jdbc:mysql://localhost:3306/name</url>
                    <user>root</user>
                    <password>123456</password>
                    <locations>
                        <location>classpath:db/migration</location>                  
                    </locations>
                </configuration>
            </plugin>

配置好之后即可使用maven插件来进行操作
wxy_2022-12-09_10-59-55

赞(0)
未经允许不得转载:工具盒子 » Springboot整合Flyway自动管理数据库变更