最近给公司项目集成flyway,由于我们项目移动端使用的是spring框架,网上看了很多博客,感觉这方面的东西还是很少的,毕竟现在是springboot的天下,大多数都是springboot集成flyway。但是还是有不少公司遗留有spring框架的项目。这里就自己肝一篇,希望能帮到更多想把flyway添加到spring项目中的人。

由于使用的是spring框架。因此我们选择低版本的flyway。

flyway各个版本请到这里去找:https://mvnrepository.com/artifact/org.flywaydb/flyway-core
我们的maven使用的是阿里云的仓库,阿里云仓库中没有低版本的依赖,我们我们需要下载jar包。这里下载的是3.0版本的jar包。

下载的包需要拷贝到项目webapp/WEB-INF/lib中(web项目都会有WEB-INF这个文件夹,只需要找到你项目中web文件夹就行,web文件夹,就是文件夹上有个蓝点的,具体看下图的webapp文件夹)

新建资源目录resources
在其下面建立db/migration(sql文件默认读取此路径下的文件夹中的.sql文件)

在pom.xml中添加,如果不添加,resources中的文件就无法打包到war包中。

    <resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
</resource>

添加flyway配置类,更多配置请看源代码

package com.dt.flyway;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.FlywayException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource; /**
* @Description: flyway配置类
* @author:
* @Date: 2021/7/12 15:57
* @Copyright: Xi'an Dian Tong Software Co., Ltd. All Rights Reserved.
* @Version 1.0
*/
public class DatabaseFlywayMigration {
protected final static Logger log = LogManager.getLogger("DatabaseFlywayMigration"); public void migrate() throws NamingException {
log.info("DatabaseFlywayMigration-->migrate:flyway开始执行,准备获取数据源");
Context context = new InitialContext();
//获取tomcat中的数据源
DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/wxi");
log.info("DatabaseFlywayMigration-->migrate:获取数据源成功,准备执行flyway配置");
Flyway flyway = new Flyway();
// 设置sql脚本文件的编码
flyway.setEncoding("UTF-8");
flyway.setOutOfOrder(true);
flyway.setDataSource(dataSource);
// 设置接受flyway进行版本管理的多个数据库
//flyway.setSchemas("flywaydemo");
// 设置存放flyway metadata数据的表名
flyway.setTable("flyway_schema_history");
// 设置执行migrate操作之前的validation行为
//flyway.setValidationMode(ValidationMode.ALL);
// 设置当validation失败时的系统行为
//flyway.setValidationErrorMode(ValidationErrorMode.FAIL); // 设置当validation失败时的系统行为
try {
flyway.setInitOnMigrate(true);
log.info("DatabaseFlywayMigration-->migrate:配置成功,即将执行sql语句");
flyway.migrate();
log.info("DatabaseFlywayMigration-->migrate:sql语句执行成功,flyway---END");
} catch (FlywayException e) {
log.error("DatabaseFlywayMigration-->migrate:执行sql语句失败,请查看日志排查错误");
flyway.repair();
e.printStackTrace();
}
}
}

在spring的xml中注入flyway配置类的bean(每个spring项目都会带有一个xml文件,用来注册bean,复制的时候注意项目中DatabaseFlywayMigration所在的路径)

 <!-- flayway -->
<bean id="flywayMigration1" class="com.dt.flyway.DatabaseFlywayMigration" lazy-init="false" init-method="migrate"> </bean>



到这里,移动端整合flyway就完成了。
以后这些sql语句,只需要放到resources/db/migration文件夹下面即可(但是这些sql命名都是不符合flyway的,需要进行名称的修改)

命名规则:
此处的SQL语句命名需要遵从一定的规范,否则运行的时候flyway会报错。命名规则主要有两种:

    仅需要被执行一次的SQL命名以大写的”V”开头,后面跟上”0~9”数字的组合,数字之间可以用“.”或者下划线”“分割开,然后再以两个下划线 _ 分割,其后跟文件名称,最后以.sql结尾。比如,V20210707__create_user.sql、V20210707__add_user.sql。
    可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。。比如,R__truncate_user_dml.sql。

其中,V开头的SQL执行优先级要比R开头的SQL优先级高。

V:固定大写

20210707.01:20210707是日期,后面用.01代表序号

因为flyway的执行是有个顺序的,比如你执行了V2021__create_user,有执行V2020_update_user。就会报错,原因就是2020<2021。所以我们要保证序号是依次增大。

Flyway 是如何比较两个 SQL 文件的先后顺序呢?它采用 采用左对齐原则, 缺位用 0 代替 。举几个例子:

    1.0.1.1 比 1.0.1 版本高。
1.0.10 比 1.0.9.4 版本高。
1.0.10 和 1.0.010 版本号一样高, 每个版本号部分的前导 0 会被忽略。

__:这个是两个 _
    例如:
    V2.0.9__upgrade.sql
    V2.0.11__upgrade.sql
    V2.0.13__upgrade.sql
    V2.0.14__upgrade.sql

spring集成flyway的更多相关文章

  1. Spring Boot 集成 Flyway 实现数据库版本控制

    在项目迭代开发中,难免会有更新数据库 Schema 的情况,比如添加新表.在表中增加字段或者删除字段等,那么当我对数据库进行一系列操作后,如何快速地在其他同事的电脑上同步?如何在测试/生产服务器上快速 ...

  2. 从零开始学 Java - Spring 集成 Memcached 缓存配置(二)

    Memcached 客户端选择 上一篇文章 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)中我们讲到这篇要谈客户端的选择,在 Java 中一般常用的有三个: Memc ...

  3. 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)

    你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...

  4. 【转】Dubbo使用例子并且和Spring集成使用

    一.编写客户端和服务器端共用接口类1.登录接口类public interface LoginService {    public User login(String name, String psw ...

  5. 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)

    硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...

  6. axis2+spring集成

    转载自:http://www.cnblogs.com/linjiqin/archive/2011/07/05/2098316.html 1.新建一个web project项目,最终工程目录如下: 注意 ...

  7. rabbitMQ第五篇:Spring集成RabbitMQ

    前面几篇讲解了如何使用rabbitMq,这一篇主要讲解spring集成rabbitmq. 首先引入配置文件org.springframework.amqp,如下 <dependency> ...

  8. 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)

    从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...

  9. spring集成常用技术的配置

    使用spring集成其他技术,最基本的配置都是模板化的,比如配置视图模板引擎.数据库连接池.orm框架.缓存服务.邮件服务.rpc调用等,以spring的xml配置为例,我将这些配置过程整理出来,并不 ...

随机推荐

  1. 统计行数、文件夹个数、文件个数的相关shell命令

    极客君最近做项目,刚好遇到需要统计一些sql文件数量的问题,用到一些实用的shell命令,记录下来,以后万一还能用上呢? 如果在终端不打开文件看到一共多少行,则可以使用wc命令来实现: wc -l [ ...

  2. Splunk 8.2.0 发布 (macOS, Linux, Windows)

    强烈鄙视 CSDN 用户 CIAS(账号:hanzheng260561728),盗用本站资源,删除原文链接,并且用于收费下载!!! 请访问原文链接:https://sysin.org/article/ ...

  3. Psexec和wmiexec的原理和区别

    PSEXEC 针对远程建立连接的方式有两种,一种先建立IPC通道连接,然后直接使用,操作如下: net use \\192.168.0.1\ipc$ "password" /use ...

  4. [leetcode] 36. 有效的数独(Java)

    没啥好说的,直接上就行 36. 有效的数独 class Solution { public boolean isValidSudoku(char[][] board) { Map<Charact ...

  5. cmodel模拟器开发

    cmodel模拟器开发 对于一个公司来说,产品的设计周期就是生命线,一般来说都会在设计功能级仿真的c-model后直接转向RTL设计. 在目前的技术下,做cycle-by-cycle的设计和直接RTL ...

  6. MindSpore 高阶优化器

    MindSpore 高阶优化器 MindSpore自研优化器THOR(Trace-based Hardware-driven layer-ORiented Natural Gradient Desce ...

  7. 五、部署LNMP环境(linux + nginx + mysql + php)

    装包(nginx.数据库.php.php调用)---------起服务-----权限   装包: yum -y install gcc openssl-devel pcre-devel zlib-de ...

  8. vue keep-alive从列表页进入详情页,再返回列表页时,还是之前滚动的位置

    //router.js { path: '/oppo-music', component: () => import('@/views/OppoMusic.vue'), meta: { titl ...

  9. sqlsever 创建一个通用分页查询

    -- Author: Mis Chen-- Create date: 2018年5月15日 11:21:47-- Description: 创建一个通用分页查询-- ================= ...

  10. 前台使用Vue

    前台搭建遇到问题 ----前台访问量大 未采用vue 单页面SAP 的方式构建 使用多HTML构建页面 项目构建 vue 2.6 https://cn.vuejs.org/ elementUI htt ...