首页 > 其他分享 >SpringBoot 整合flyway

SpringBoot 整合flyway

时间:2022-08-19 13:00:37浏览次数:75  
标签:SpringBoot void flyway private 整合 org import public

目录

前言:本文章专用于因版本问题导致springboot整合flyway不成功无法自动迁移的情况

【pom.xml】

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>3.0</version>
</dependency>
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1.1-jre</version>
</dependency>
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.0.M4</version>
</dependency>

【启动类】

@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

【配置属性类】

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
 * @author JHL
 * @version 1.0
 * @date 2022/8/19 12:20
 * @since : JDK 11
 */
@ConfigurationProperties(prefix = FlywayProperties.PREFIX)
@Configuration
public class FlywayProperties {

    public static final String PREFIX = "flyway";
    /**
     * sql脚本文件路径
     */
    private String flywayScriptLocation = "classpath:db/migration/";
    /**
     * 自动迁移
     */
    private Boolean flywayAutoMigration = true;
    /**
     * 发生错误的时候清理表
     */
    private Boolean cleanOnValidationError = true;
    /**
     * 结束时间自动清理表
     */
    private Boolean autoCleanTable = true;

    public Boolean getCleanOnValidationError() {
        return cleanOnValidationError;
    }

    public void setCleanOnValidationError(Boolean cleanOnValidationError) {
        this.cleanOnValidationError = cleanOnValidationError;
    }

    public Boolean getAutoCleanTable() {
        return autoCleanTable;
    }

    public void setAutoCleanTable(Boolean autoCleanTable) {
        this.autoCleanTable = autoCleanTable;
    }

    public String getFlywayScriptLocation() {
        return flywayScriptLocation;
    }

    public void setFlywayScriptLocation(String flywayScriptLocation) {
        this.flywayScriptLocation = flywayScriptLocation;
    }

    public Boolean getFlywayAutoMigration() {
        return flywayAutoMigration;
    }

    public void setFlywayAutoMigration(Boolean flywayAutoMigration) {
        this.flywayAutoMigration = flywayAutoMigration;
    }
}

【配置类】

import com.alibaba.druid.pool.DruidDataSource;
import com.google.common.collect.Maps;
import org.apache.commons.lang3.StringUtils;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.MigrationInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import java.util.Map;

/**
 * @author JHL
 * @version 1.0
 * @date 2022/8/19 11:17
 * @since : JDK 11
 */
@Configuration
public class FlywayConfig implements InitializingBean, DisposableBean {
    private static final Logger log = LoggerFactory.getLogger(FlywayConfig.class);

    @Autowired
    private FlywayProperties flywayProperties;

    @Autowired
    private DruidDataSource druidDataSource;

    @Override
    public void afterPropertiesSet() throws Exception {
        if (flywayProperties.getFlywayAutoMigration()) {
            migrateAutomatically(druidDataSource.getName());
            log.info("########### [ flyway 数据库初始化成功! ]  ###########");
        }
    }

    @Override
    public void destroy() throws Exception {
        if (flywayProperties.getAutoCleanTable() && flywayProperties.getFlywayAutoMigration()) {
            cleanAutomatically(druidDataSource.getName());
            log.info("###########  [ flyway 数据库表清空成功! ]  ###########");
        }
    }

    private Map<String, Flyway> flyways() {
        Map<String, Flyway> flywayMap = Maps.newHashMap();
        String migrationFilesLocation = null;
        Flyway flyway = null;
        migrationFilesLocation = flywayProperties.getFlywayScriptLocation();
        flyway = new Flyway();
        flyway.setDataSource(druidDataSource.getUrl(), druidDataSource.getUsername(), druidDataSource.getPassword());
        flyway.setLocations(migrationFilesLocation);
        if (flywayProperties.getCleanOnValidationError()) {
            flyway.setCleanOnValidationError(true);
        }
        if (flywayProperties.getFlywayAutoMigration()) {
            flyway.setInitOnMigrate(true);
        }
        flywayMap.put(druidDataSource.getName(), flyway);
        return flywayMap;
    }


    private void migrateAutomatically(String dbName) {
        Map<String, Flyway> flywayMap = flyways();
        flywayMap.get(dbName).migrate();
    }

    private void cleanAutomatically(String dbName) {
        Map<String, Flyway> flywayMap = flyways();
        flywayMap.get(dbName).clean();
    }

    private void checkState(String dbName) {
        Map<String, Flyway> flywayMap = flyways();

        MigrationInfo[] pendingMigrations = flywayMap.get(dbName).info().pending();

        if (pendingMigrations != null) {
            throw new RuntimeException(dbName + "-" + StringUtils.join(pendingMigrations, ","));
        }
    }
}

【配置文件】

# 数据库脚本版本控制
flyway:
  flywayScriptLocation: classpath:db/migration/
  flywayAutoMigration: true
  cleanOnValidationError: true
  autoCleanTable: true

【IDEA插件支持】

Flyway Migration Creation用于按照flyway的规则自动生成数据库脚本的文件名称的插件

SQL 脚本命名规范如下

Prefix+Version+Separator+Description+Suffix

Prefix 前缀:V 代表版本迁移,U 代表撤销迁移,R 代表可重复迁移

Version 版本号:版本号通常 . 和整数组成

Separator 分隔符:固定由两个下划线 __ 组成

Description 描述:由下划线分隔的单词组成,用于描述本次迁移的目的

Suffix 后缀:如果是 SQL 文件那么固定由 .sql 组成,如果是基于 Java 类则默认不需要后缀

【参考文章】

推荐阅读——flyway的快速入门教程

Flyway组件的简介、工作流程和使用

springboot flyway 整合(不生效原因)

标签:SpringBoot,void,flyway,private,整合,org,import,public
From: https://www.cnblogs.com/hhddd-1024/p/16601644.html

相关文章

  • SpringBoot简介
    SpringBoot简介回顾什么是SpringSpring是一个开源框架,2003年兴起的一个轻量级的Java开发框架,作者:RodJohnson 。Spring是为了解决企业级应用开发的复杂性而创建的,简......
  • 成功进行数据整合的案例
    目前大多数公司使用了许多ERP系统、CRM系统等七八个系统来推动公司的运行,提高公司的效率。不可置疑,这是十分有效的,但是随着各个系统的独立运行,尤其是不同的系统所使用的数......
  • 关于SpringBoot整合redis使用Lettuce客户端超时问题
    问题起因使用到Lettuce连接redis,一段时间后不操作,再去操作redis,会报连接超时错误,在其重连后又可使用。原因是:Lettuce自适应拓扑刷新(Adaptiveupdates)与定时拓扑刷新(Peri......
  • docker compose搭建redis7.0.4高可用一主二从三哨兵集群并整合SpringBoot【图文完整版
    一、前言redis在我们企业级开发中是很常见的,但是单个redis不能保证我们的稳定使用,所以我们要建立一个集群。redis有两种高可用的方案:HighavailabilitywithRedisSen......
  • Springboot 通过FastJson实现bean对象和Json字符串互转
    Json格式在后台服务中的重要性就不多说了,直入正题。首先引入pom文件,这里使用的是1.2.83版本1<dependency>2<groupId>com.alibaba</groupId>3......
  • springBoot配置文件properties和yml数组写法
    springBoot配置文件properties和yml数组写法springBoot配置文件properties和yml数组写法这里介绍一下springBoot中的两种文件配置方式中数组的使用,也就是集合。以下是......
  • springboot
    @Controller:标识一个Spring类是Spring MVC controller处理器@RestController:@RestController是@Controller和@ResponseBody的结合体,两个标注合并起来的作用@Controller......
  • SpringBoot之发送邮件(手把手教你通过Java发送邮件)
    SpringBoot之发送邮件(手把手教你通过Java发送邮件)前言我们都知道,在使用一个新的APP时经常需要我们注册,注册时需要我们输入手机号然后接受验证码,当然还有一类是需要......
  • springboot
    1、mybatisplus自动填充:数据库级别操作  2、注解:(1)@TableId(type=IdType.INPUT):自动新增Id(2)@TableField//表示在新增时候插入createTime@TableField(fill=......
  • springboot实现多级嵌套并返回json格式的数据处理
    菜单功能列表嵌套菜单解决方案本文目录       菜单功能列表嵌套菜单解决方案           1、通过mapper定义sql的自循环,在查询时就完成菜单的嵌套  ......