spring框架集成flyway项目的详细过程
作者:天下没有收费的bug 发布时间:2023-09-14 11:47:14
什么是Spring
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。
然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
目的:解决企业应用开发的复杂性
功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
范围:任何Java应用
它是一个容器框架,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把Struts和hibernate粘合在一起运用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Flyway简介
Flyway是一个数据库版本化管理工具,通过SQL脚本实现DB Migration自动化升级,支持独立运行,也可以和构建工具或者Spring开发环境集成。
最近给公司项目集成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
作者:天下没有收费的bug出处:https://www.cnblogs.com/LoveBB/本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
来源:https://www.cnblogs.com/LoveBB/archive/2021/07/13/15005418.html
猜你喜欢
- [LeetCode] 2. Add Two Numbers 两个数字相加You are given two non-empty&n
- 先看看效果Like This↓一、公共WiFi 公用电脑什么的在我们日常在线上工作、玩耍时,不论开电脑、登录淘宝、玩网游统统都会用到键盘输入
- 导入依赖(pom.xml) <!--整合Shiro安全框架--> <dependency>
- 前言Go 语言比 Java 语言性能优越的一个原因,就是轻量级线程Goroutines(协程Coroutine)。本篇文章深入分析下 Jav
- java的jar是一个打包工具,用于将我们编译后的class文件打包起来,这里面主要是举一个例子用来说明这个工具的使用。在C盘下的temp文
- 1 StringString:字符串常量,字符串长度不可变。2 StringBufferStringBuffer:字符串变量(Synchro
- 0.前言HashMap简述:HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。H
- 用java来打包文件生成压缩文件,有两个地方会出现乱码:内容的中文乱码问题:修改sun的源码。使用开源的类库org.apache.tools
- 这篇文章主要介绍了spring boot如何实现切割分片上传,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Threa
- 一、Stream流介绍在JDK8时,JAVA新增了lambda表达式,它与 java.io 包里的 InputStream和 OutputS
- 背景最近引入了 Nacos Config 配置管理能力,说起来用法很简单,还是踩了三个坑。Nacos Config 的 nacos 的帐号密
- 序言因为之前在项目中使用看groovy对业务进行一些抽象,效果比较好,过程中踩过一些坑,所以简单记录分享一下自己如何一步一步去实现的为什么用
- 前言现如今几乎大多数Java应用,例如我们耳熟能详的tomcat, struts2, netty...等等数都数不过来的软件,要满足通用性,
- 导出的 Jar 包无法运行?导出的 Jar 包找不到 Main class?大概是我对导出 Jar 包的理解不深吧,反正一直不太懂 IDEA
- Mybatis的Dao层实现传统开发方式编写UserDao接口public interface UserDao {  
- synchronized都问啥?如果Java面试有什么是必问的,synchronized必定占据一席之地。初出茅庐时synchronized
- 环境:apache-tomcat-8.5.15jdk1.8.0_172IDEA建立一个maven-webapp项目:Create New P
- 1.应用实例需求: 演示 Spring-Boot 通过表单注册用户,并支持上传图片2.代码实现代码实现-文件上传创建 templates/u
- Java泛型映射不同的值类型详解前言:一般来说,开发人员偶尔会遇到这样的情形: 在一个特定容器中映射任意类型的值。然而Java 集合API只