运用flyway实现数据库版本自动更新控制实录
摘要
- flyway版本说明
- 命令行模式调用flyway
- Java API模式调用flyway
- spring配置实现项目启动自动更新数据库
一 测试环境
- 操作系统:64位win7旗舰版SP1
- 数据库:Oracle11.2.0.1.0
- jdk版本:jdk7u21
- maven项目
- flyway版本:flyway4.2.0
二 flyway版本说明和下载地址
1 flyway官网:https://flywaydb.org/
2 版本说明:5.0以后版本需要jdk8/9的支持。我们需要使用4.2或以前的版本。
如果使用的jdk版本太低,会出现如下错误:
Unsupported major.minor version 52.0
52代表至少需要jdk1.8才能运行;各版本jdk对应的version如下:
jdk1.8 52
jdk1.7 51
jdk1.6 50
jdk1.5 49
jdk1.4 48
jdk1.3 47
jdk1.2 46
jdk1.1 45
3 flyway历史版本下载地址:https://repo1.maven.org/maven2/org/flywaydb/
4 官方教程:https://flywaydb.org/getstarted/
三 使用命令行模式更新数据库
1 下载命令行工具并解压:
https://repo1.maven.org/maven2/org/flywaydb/flyway-commandline/4.2.0/
可以看到官方没有提供32位的工具包,意味着32位系统无法使用命令行模式
2 将Oracle数据库连接驱动复制到drivers目录下
3 修改配置文件conf\flyway.conf中的数据库连接信息
4 在sql目录下创建更新脚本
sql脚本命名规范:前辍(V/R)+版本号(小版本之间以.或_分隔)+双下划线+描述.sql。
如:V1_1__Create_version_table_comment.sql。创建1.1版本,为版本记录表添加中文注释
脚本内容:
comment on table "schema_version" is '数据库版本更新记录表';
comment on column "schema_version"."installed_rank" is '数据库版本记录主键';
comment on column "schema_version"."version" is '版本号';
comment on column "schema_version"."description" is '版本描述';
comment on column "schema_version"."type" is '更新脚本类型';
comment on column "schema_version"."script" is '更新脚本名称';
comment on column "schema_version"."checksum" is '校验码';
comment on column "schema_version"."installed_by" is '更新人';
comment on column "schema_version"."installed_on" is '更新时间';
comment on column "schema_version"."execution_time" is '执行时间';
comment on column "schema_version"."success" is '更新结果;1:成功;';
脚本格式设置为utf-8,否则中文会乱码。
5 在cmd中定位到工具根目录,然后执行flyway migrate命令
6 运行过程/结果说明:
第1行进行数据库连接。如果驱动或url不对都会报错。用户名密码不对会要求手工输入。
第2行提示数据库版本验证成功。
第3行创建数据库版本更新记录表。只有第一次运行才会出现这个。
第4行显示当前数据库版本号为空
第5行开始提示按顺序提示更新进度,直到更新到最新版本为止。(意味着不能少,不能错)。
最后1行提示成功提交了一次版本更新,并给出了执行时间。
7 查询数据库验证结果
查看schema_version表结构
查看schema_version数据
从cmd命令的运行过程,我们已经大致了解了flyway的工作流程。
四 在maven项目中调用flyway Java API自动更新数据库
1 pom文件中配置flyway架包依赖(项目中早就有jdbc就不重新配了)
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>4.2.0</version>
</dependency>
2 新增flyway的Java调用类
import org.flywaydb.core.Flyway;
import javax.sql.DataSource;
/**
* # 该类用于控制数据库版本更新
*
* @author: cj Created on 2018/1/19 9:03.
* @param:
* @return:
**/
public class FlywayMigration {
/**
* 定义私有数据源
*/
private DataSource dataSource;
/**
* # 该方法用于读取配置文件的数据源
*
* @author: cj Created on 2018/1/19 9:14.
* @param: dataSource spring中配置的数据源property
* @return:
**/
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
/**
* # 该方法通过调用flyway的Java API实现指定数据库的版本控制。由于在spring中配置了实例化父类时会执行该方法,所以在每次项目更新重启之后都会根据定义好的sql脚本自动将数据库更新到匹配的版本
*
* @author: cj Created on 2018/1/19 9:26.
* @param:
* @return:
**/
public void migrate() {
Flyway flyway = new Flyway();
System.out.println(flyway.getClass().getClassLoader().getResource("").getPath());//输出当前目录,用于核对脚本路径是否能正确读取
flyway.setDataSource(dataSource);//设置数据源
//flyway.setSchemas("flywaydemo"); // 设置接受flyway进行版本管理的多个数据库
//flyway.setTable("schema_version");// 设置存放flyway metadata数据的表名.默认小写的schema_version
flyway.setBaselineOnMigrate(true);//设置基线,已经开发过一段时间的数据库需要设置为true
flyway.setLocations("db.migrations", "com.**.db.flyway.migrations"); //设置flyway扫描sql升级脚本、java升级脚本的目录路径或包路径。脚本命名规约详见flyway官网
flyway.setEncoding("UTF-8"); // 设置sql脚本文件的编码
flyway.migrate();
}
}
3 增加sql目录和脚本
4 spring中新增bean配置
<!-- 实例化后自动执行migrate方法完成数据库版本更新-->
<bean id="flywayMigration" class="com.**.db.flyway.FlywayMigration" init-method="migrate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 新增依赖设置,防止数据库版本更新完成之前与数据库交互-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" depends-on="flywayMigration">
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描entity目录, 省掉Configuration.xml里的手工配置 -->
<property name="mapperLocations" value="classpath:com/**/db/mapping/*.xml"/>
</bean>
<!-- 配置事务管理器 新增依赖设置,防止数据库版本更新完成之前与数据库交互-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" depends-on="flywayMigration">
<property name="dataSource" ref="dataSource"/>
</bean>
5 svn锁定版本更新内容
6 项目运行结果
已经建立了数据库版本基线,完成了版本1.1的更新