Spring Boot 数据库初始化及结合 Flyway 使用

1. 数据库初始化

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
    <scope>runtime</scope>
</dependency>

修改application.yml

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:4306/test-init?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: root
    # 表
    schema:
      - classpath:script/user.sql
    # 数据
    data:
      - classpath:script/user-data.sql
    # 文件编码
    sql-script-encoding: utf-8
    # always 启动都执行初始化,embedded 只初始化内存数据库(默认值),never 不执行初始化
    initialization-mode: always
    # 错误时是否继续
    continue-on-error: true

根据配置,将数据库脚本放在 resources/script 下
数据库脚本位置
第一次启动时,需要将spring.datasource.initialization-mode要设成always。后续启动要再改为never,否则启动一次就会执行一次。后续更新不是很方便。

数据库脚本
user.sql

CREATE TABLE IF NOT EXISTS `user`  (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `deleted` tinyint(1) NULL DEFAULT 0,
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

user-data.sql

INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三1', '1', 1);
INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三2', '2', 1);
INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三3', '1', 0);
INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三4', '2', 0);
INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三5', '1', 0);

2. Flyway

Flyway 是一款开源的数据库版本管理工具,它更倾向于约定优于配置的方式。Flyway 可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations 可以写成 SQL 脚本,也可以写在 Java 代码中,不仅支持 Command Line 和 Java API,还支持 Build 构建工具和 Spring Boot 等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。

2.1 原理

Flyway会先创建表flyway_schema_history,该表用于根据数据库的状态,记录了数据库迁移到版本,迁移成功等信息。然后Flyway开始扫描配置路径下的数据迁移文件,根据它们的版本号进行按序迁移,并记录到该表中。该表记录了迁移的版本号,如果文件的版本号小于或等于标记为当前版本的版本号,则忽略它们不执行。

2.2 使用

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.2</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
</dependency>

修改application.yml

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:4306/test-flyway?useUnicode=true&characterEncoding=UTF-8&useSSL=false
    username: root
    password: root
  flyway:
    # 禁止清理数据库表
    clean-disabled: true
    # 如果数据库不是空表,需要设置成 true
    baseline-on-migrate: true
    # 与 baseline-on-migrate: true 搭配使用
    baseline-version: 0
    locations:
      - classpath:flyway/mysql

按照规定的文件名 V{version}__{name}.sql 创建 。

  1. V:默认前缀,可通过spring.flyway.sql-migration-prefix修改
  2. {version}:版本号,可添加小版本号。
  3. {version}{name}之前是两个_

根据配置,将数据库脚本放在 resources/flyway/mysql 下
创建脚本
启动后两个脚本就会被记录到表flyway_schema_history中
flyway_schema_history
添加新脚本时,需要往上添加版本号,否则不会执行。
添加新脚本
重新启动,新脚本也被记录到表中。
flyway_schema_history
数据库脚本
V1__user.sql

CREATE TABLE IF NOT EXISTS `user`  (
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `deleted` tinyint(1) NULL DEFAULT 0,
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

V2_1__user_data.sql

INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三1', '1', 1);
INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三2', '2', 1);
INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三3', '1', 0);
INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三4', '2', 0);
INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三5', '1', 0);

V2_1_1__user_data.sql

INSERT INTO `user`(`name`, `type`, `deleted`) VALUES ('张三6', '1', 0);

参考:
SpringBoot 官方文档 在启动时执行Flyway数据库迁移
Flyway 官方文档
Flyway 简单入门教程

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值