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
创建 。
V
:默认前缀,可通过spring.flyway.sql-migration-prefix
修改{version}
:版本号,可添加小版本号。{version}
和{name}
之前是两个_
。
根据配置,将数据库脚本放在 resources/flyway/mysql 下
启动后两个脚本就会被记录到表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 简单入门教程