运用flyway实现数据库版本自动更新控制实录

运用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目录下

复制jdbc

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表结构

运行结果1

查看schema_version数据

运行结果2
从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的更新
运行结果3
运行结果4

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值