194. Spring Boot 数据库迁移:Flyway
说明:
(1)Spring Boot 版本:1.5.12.RELEASE
(2)Flyway版本:3.2.1
前言:
在上一篇文章中,我们提到了Spring Boot为两款流行的数据库迁移工具提供了自动配置支持,这节我们就先介绍下Flyway。
一、什么是Flyway?
官网地址:http://flywaydb.org
Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
二、为什么使用Flyway?
在开发产品新特性过程中,难免会遇到需要更新数据库Schema的情况,比如:添加新表,添加新字段和约束等。那么如何快速地在其他开发者机器上同步?并且如何在测试服务器上快速同步?以及如何保证集成测试能够顺利执行并通过呢?
以上问题可以通过Flyway工具来解决,Flyway可以实现自动化的数据库版本管理,并且能够记录数据库版本更新记录
三、Flyway在Sping Boot的使用
3.1 新建一个项目
新建项目,取名为:springboot-flyway
3.2 添加依赖
在pom.xml文件中添加依赖:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.kfit</groupId> <artifactId>springboot-flyway</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>springboot-flyway</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.12.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
说明:
(1)Flyway的依赖是:flyway-core;
(2)为什么需要配置JPA和MySQL驱动:默认情况下,Flyway会自动注入注解了@Primary的DataSource,那么这个数据源是哪来的呢?那这里就是使用了JPA了(当然你可以使用jdbcTemplate或者是MyBatis);由于我们使用mysql数据库进行测试,那么就需要引入MySQL驱动了。
3.3 添加配置
在application.properties文件添加配置:
### datasourcespring.datasource.platform=mysqlspring.datasource.url = jdbc:mysql://localhost:3306/flyway_testspring.datasource.username = rootspring.datasource.password = rootspring.datasource.driverClassName = com.mysql.jdbc.Driver### jpaspring.jpa.database = MYSQLspring.jpa.show-sql = truespring.jpa.hibernate.ddl-auto = none
这个没什么好说的,就是数据源和jpa的基本配置。
3.4 Flyway存放路径说明
默认情况下是classth:db/migration,但你能够使用flyway.locations进行修改。这里我们使用默认就好了,为了接下里的测试,在resources创建目录db/migration:
src/main/resources
- db
-- migration
3.5 Flyway sql脚本命令规则
对于Flyway的脚本V<VERSION>__<NAME>.sql,这里的VERSION使用下划线进行命名的方式,比如:直接命名为1或者是1_1(这个就是代表1.1版本);NAME:对当前脚本的描述,这里举例说明下:
V3__insertBook.sql:这就代表version=3,描述为insertBook;V2_1__insertAuthor.sql:这就代表version=2.1,描述为insertAuthor;
温馨提醒:其一这里的V字母要大写;其二上面中间是双杠。
3.6 测试一
db/migration下新建文件V1_1__init.sql,脚本如下:
CREATE TABLE book ( id int UNSIGNED NOT NULL AUTO_INCREMENT, name varchar(255) NULL, createTime datetime NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`));
运行应用,查看数据库中是否多了两个表:
其一是book表,这是我们脚本中创建的,其二是Flyway版本管理的表schema_version:
(这里是截取了,执行了之后脚本的图,第一次执行的话,应该只会一条数据。)
3.7 测试二
db/migration下新建文件V1_2__insertBook.sql,脚本如下:
INSERT INTO book(name, createTime) VALUES ('从零开始学Spring Boot', '2018-04-21 16:53:48');
运行应用,查看book表中是否多了条数据,schema_version是否多了条版本记录。
到此为止,Flyway的使用就一切顺利了,到这里就告一段落了。
购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287