SpringBoot使用Flyway进行数据库管理的操作方法

2022-10-15

Flyway是一个开源的数据库版本管理工具,并且极力主张“约定大于配置”,简单、专注、强大。接下来通过本文给大家介绍SpringBoot使用Flyway进行数据库管理的方法,感兴趣的朋友一起看看吧

目录
  • 一、Flyway简介
  • 二、SpringBoot集成使用
    • 1.pom.xml引入依赖
    • 2.application.properties
    • 3.resources创建db数据库脚本文件夹
    • 4.启动DemoApplication主启动类
  • 三、项目整体结构

    一、Flyway简介

    Flyway是一款数据库迁移(migration)工具。简单点说,就是在你部署应用的时候,帮你执行数据库脚本的工具。Flyway支持SQL和Java两种类型的脚本,你可以将脚本打包到应用程序中,在应用程序启动时,由Flyway来管理这些脚本的执行,这些脚本被Flyway称之为migration。

    就目前而言,我们部署应用的流程大概是这样的:

    开发人员将应用程序打包、按顺序汇总并整理数据库升级脚本
    DBA拿到数据库升级脚本检查、备份、执行,以完成数据库升级
    应部署人员拿到应用部署包,备份、替换,以完成应用程序升级
    引入Flyway之后的应用部署流程大概是这样的:

    开发人员将应用程序打包
    应部署人员拿到应用部署包,备份、替换,以完成应用程序升(Flyway将自动执行升级/备份脚本)。

    二、SpringBoot集成使用

    1.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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    	<modelVersion>4.0.0</modelVersion>
    	<parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>2.0.3.RELEASE</version>
    		<relativePath/> <!-- lookup parent from repository -->
    	</parent>
    	<groupId>com.example</groupId>
    	<artifactId>demo</artifactId>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>demo</name>
    	<description>Demo project for Spring Boot</description>
    	<properties>
    		<java.version>1.8</java.version>
    	</properties>
    	<dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    		</dependency>
    
    		<!-- mysql 依赖 -->
    		<dependency>
    			<groupId>mysql</groupId>
    			<artifactId>mysql-connector-java</artifactId>
    		</dependency>
    
    		<!-- 数据库版本管理 依赖 -->
    		<dependency>
    			<groupId>org.flywaydb</groupId>
    			<artifactId>flyway-core</artifactId>
    		</dependency>
    
    		<!-- 数据库访问依赖 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-jdbc</artifactId>
    		</dependency>
    
    		<!-- 自动生成get,set方法 依赖 -->
    		<dependency>
    			<groupId>org.projectlombok</groupId>
    			<artifactId>lombok</artifactId>
    		</dependency>
    
    	</dependencies>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin</artifactId>
    			</plugin>
    		</plugins>
    	</build>
    
    </project>

    2.application.properties

    # 端口
    server.port=8082
    
    # 数据源
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
    spring.datasource.username=root
    spring.datasource.password=root
    
    # flyway    注:可以完全不用配置
    ## sql 脚本的位置,默认为 classpath:db/migration。可手动指定
    spring.flyway.locations=classpath:db
    ##  指定数据源,如果没有指定的话,将使用配置的主数据源
    spring.flyway.url=jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false
    ## Flyway 管理的 Schema 列表,区分大小写。默认连接对应的默认 Schema
    ## 如果这里明确指定了库名,那么在 spring.flyway.url 连接中指定的库名将无效
    spring.flyway.schemas=test1
    ## 用户名
    spring.flyway.user=root
    ## 密码
    spring.flyway.password=root
    ## 开启,默认开启
    spring.flyway.enabled=true

    3.resources创建db数据库脚本文件夹

    V0.1.0__init_table.sql

    -- 创建表
    create table t_startAlarm
    (
        id      int(100) primary key not null auto_increment,
        name     varchar(100),
        type      varchar(100)
    )

    V0.1.1__init_table.sql

    -- 初始化数据
    INSERT INTO t_startAlarm ( id , name , type ) VALUES
    ('1','电饭煲','用来蒸饭')

    V0.1.2__init_table.sql

    -- 初始化数据
    INSERT INTO t_startAlarm ( id , name , type ) VALUES
    ('2','电饭煲2','用来蒸饭2')

    4.启动DemoApplication主启动类

    4.1只有V0.1.0__init_table.sql和V0.1.1__init_table.sql。
    项目启动,Flyway 会自动创建一个 flyway_schema_history 表,这个表用来记录数据库的更新历史。

    有了这条记录,下次再启动项目,V0.1.1__init_table.sql 这个脚本文件就不会执行了,因为系统知道这个脚本已经执行过了,如果你还想让 V0.1.1__init_table.sql 脚本再执行一遍,需要手动删除 flyway_schema_history 表中的对应记录,那么项目启动时,这个脚本就会被执行了。

    注意:

    我们在定义脚本的时候,除了 V 字开头的脚本之外,还有一种 R 字开头的脚本,V 字开头的脚本只会执行一次,而 R字开头的脚本,只要脚本内容发生了变化,启动时候就会执行。

    使用了 Flyway之后,如果再想进行数据库版本升级,就不用该以前的数据库脚本了,直接创建新的数据库脚本,项目在启动时检测了有新的更高版本的脚本,就会自动执行,这样,在和其他同事配合工作时,也会方便很多。因为正常我们都是从Git 上拉代码下来,不拉数据库脚本,这样要是有人更新了数据库,其他同事不一定能够收到最新的通知,使用了 Flyway就可以有效避免这个问题了。

    所有的脚本,一旦执行了,就会在 flyway_schema_history表中有记录,如果你不小心搞错了,可以手动从 flyway_schema_history 表中删除记录,然后修改 SQL脚本后再重新启动(生产环境不建议)。

    测试数据库中结果:

    添加V0.1.2__init_table.sql,测试数据库中结果

    三、项目整体结构

    代码地址链接: SpringbootFlyway

    参考文章

    https://www.cnblogs.com/wangzh1guo/articles/13834706.html

    到此这篇关于SpringBoot使用Flyway进行数据库管理的文章就介绍到这了,更多相关SpringBoot Flyway数据库管理内容请搜索北冥有鱼以前的文章或继续浏览下面的相关文章希望大家以后多多支持北冥有鱼!

    《SpringBoot使用Flyway进行数据库管理的操作方法.doc》

    下载本文的Word格式文档,以方便收藏与打印。