SpringBoot2整合Flyway(二)

Flyway是什么?

Flyway是一款开源的数据库版本管理工具,Flyway可以独立于应用实现管理并跟踪数据库的变更,Flyway根据自己的约定,不需要复杂的配置就可以实现数据的Migrate。Migrations可以写成SQL脚本,也可以写在Java代码中,Flyway还支持Spring Boot。

如果你和我一样,有开发环境,测试环境,RC环境,生产环境,还有为某些渠道商户定制搭建的环境。那么哪怕是增加一个字段,你都必须在各个环境执行一遍。如何改动较大,比如某一个开发版本增加了10张表,修改了N表的注释,字段长度等等等等。想想头就大了,就算天天想,时时想。最后上生产环境还是会有遗漏。

现在有了flyway,一切变得轻松。

1、添加pom.xml

<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.tompai.jooq</groupId>
	<artifactId>springboot-jooq</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>springboot-jooq</name>
	<url>http://maven.apache.org</url>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.2.RELEASE</version>
	</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-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jooq</artifactId>
		</dependency>

		<dependency>
			<groupId>org.jooq</groupId>
			<artifactId>jooq-meta</artifactId>
		</dependency>

		<dependency>
			<groupId>org.jooq</groupId>
			<artifactId>jooq-codegen</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<dependency>
			<groupId>org.flywaydb</groupId>
			<artifactId>flyway-core</artifactId>
		</dependency>

		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>28.2-jre</version>
		</dependency>

		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.9.2</version>
		</dependency>
		<dependency>
			<groupId>commons-lang</groupId>
			<artifactId>commons-lang</artifactId>
			<version>2.6</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.10</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.10.5</version>
		</dependency>

	</dependencies>

	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-compiler-plugin</artifactId>
					<configuration>
						<source>${java.version}</source>
						<target>${java.version}</target>
					</configuration>
				</plugin>

				<plugin>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-maven-plugin</artifactId>
					<executions>
						<execution>
							<goals>
								<goal>repackage</goal>
							</goals>
						</execution>
					</executions>
				</plugin>

				<plugin>
					<groupId>it.ozimov</groupId>
					<artifactId>yaml-properties-maven-plugin</artifactId>
					<version>1.1.3</version>
					<executions>
						<execution>
							<phase>initialize</phase>
							<goals>
								<goal>read-project-properties</goal>
							</goals>
							<configuration>
								<files>
									<file>src/main/resources/application.yml</file>
								</files>
							</configuration>
						</execution>
					</executions>
				</plugin>

				<plugin>
					<groupId>org.flywaydb</groupId>
					<artifactId>flyway-maven-plugin</artifactId>
					<version>6.1.3</version>
					<executions>
						<execution>
							<phase>generate-sources</phase>
							<goals>
								<goal>migrate</goal>
							</goals>
						</execution>
					</executions>
					<configuration>
						<url>${spring.datasource.url}</url>
						<user>${spring.datasource.username}</user>
						<password>${spring.datasource.password}</password>
						<locations>
							<location>filesystem:src/main/resources/db/migration</location>
						</locations>
					</configuration>
				</plugin>

				<plugin>
					<groupId>org.jooq</groupId>
					<artifactId>jooq-codegen-maven</artifactId>
					<executions>
						<execution>
							<id>jooq</id>
							<phase>generate-sources</phase>
							<goals>
								<goal>generate</goal>
							</goals>
							<configuration>
								<jdbc>
									<driver>${spring.datasource.driverClassName}</driver>
									<url>${spring.datasource.url}</url>
									<user>${spring.datasource.username}</user>
									<password>${spring.datasource.password}</password>
								</jdbc>
								<generator>
									<database>
										<name>org.jooq.util.mysql.MySQLDatabase</name>
										<includes>.*</includes>
										<excludes></excludes>
										<dateAsTimestamp>true</dateAsTimestamp>
										<inputSchema>jooq</inputSchema>
									</database>
									<generate>
										<deprecated>false</deprecated>
										<instanceFields>true</instanceFields>
										<pojos>true</pojos>
									</generate>
									<target>
										<packageName>com.tompai.jooq.generator</packageName>
										<directory>src/main/java</directory>
									</target>
								</generator>
							</configuration>
						</execution>
					</executions>
					<dependencies>
						<dependency>
							<groupId>mysql</groupId>
							<artifactId>mysql-connector-java</artifactId>
							<version>5.1.46</version>
						</dependency>
					</dependencies>
				</plugin>
			</plugins>
		</pluginManagement>

		<resources>
			<resource>
				<directory>src/main/java</directory>
				<excludes>
					<exclude>**/*.java</exclude>
				</excludes>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>
	</build>
</project>

2、application.yml配置

spring:
  profiles:
    active: dev
  aop:
    auto: true
    proxy-target-class: true
  datasource:
    url: jdbc:mysql://localhost:3306/db_jooq?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
    username: root
    password: 111
    driver-class-name: com.mysql.jdbc.Driver
  jooq:
    sql-dialect: mysql
  flyway:
    clean-disabled: true #禁用clean操作
    enabled: true #使flyway生效
    baseline-on-migrate: true #初始化时如果不存在迁移记录表,默认新建一个
    out-of-order: true #防止开发环境下漏掉没来得及apply的文件,产品环境最好设为false
    locations: classpath:/db/migration

3、/db/migration/V1__init_database.sql文件,新增一张表sys_log

CREATE TABLE `sys_log` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `ip_address` varchar(50) DEFAULT NULL COMMENT 'ip地址',
   `oper_id` int(11) DEFAULT NULL COMMENT '操作人ID',
   `user_name` varchar(50) DEFAULT NULL COMMENT '用户名',
   `module_name` varchar(50) DEFAULT NULL COMMENT '模块名称',
   `method_name` varchar(50) DEFAULT NULL COMMENT '方法名',
   `method_desc` varchar(100) DEFAULT NULL COMMENT '方法描述',
   `oper_content` varchar(6000) DEFAULT NULL COMMENT '操作内容',
   `create_time` datetime DEFAULT NULL COMMENT '创建时间',
   `app_id` int(11) DEFAULT NULL COMMENT '应用ID',
   PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4、首次执行需要在数据库实例jooq_test创建表flyway_schema_history,flyway_schema_history是flyway版本控制记录表,必须要创建。

CREATE TABLE `flyway_schema_history` (
  `installed_rank` int(11) NOT NULL,
  `version` varchar(50) DEFAULT NULL,
  `description` varchar(200) NOT NULL,
  `type` varchar(20) NOT NULL,
  `script` varchar(1000) NOT NULL,
  `checksum` int(11) DEFAULT NULL,
  `installed_by` varchar(100) NOT NULL,
  `installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `execution_time` int(11) NOT NULL,
  `success` tinyint(1) NOT NULL,
  PRIMARY KEY (`installed_rank`),
  KEY `flyway_schema_history_s_idx` (`success`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

5、启动SpringBoot程序JooqApplication,启动时会自动执行数据库脚本文件。

package com.tompai.jooq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@EnableSwagger2
@EnableTransactionManagement
@SpringBootApplication(scanBasePackages = {"com.tompai.jooq"})
public class JooqApplication {

    public static void main(String[] args) {
        SpringApplication.run(JooqApplication.class, args);
    }
}

6、登录数据库查询发现多了两张表

sys_log是我们在V1__init_database.sql中新增的表;

flyway_schema_history是flyway版本控制记录表;

查询表flyway_schema_history,可以看到刚才执行V1__init_database.sql脚本的记录已经有了。

发布了248 篇原创文章 · 获赞 32 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/tianshan2010/article/details/103980032
今日推荐