为了方便记录数据库的表变更情况,发现了数据库版本管理软件,而java对应的是flyway
 我先是大概看了一下官方文档,然后就参考别人的教程用一下。Flyway快速上手教程,发现我用Flyway 8.5.11版本在JAVA 17spring boot 2.5.4MySQL 8里并不像他那教程里,能够跟着spring-boot启动运行。

 翻看其它教程,很多都是配置好就能用、写测试类里用、使用Maven里调用。最终还是尝试官方文档里的方法

在pom.xml里引入最新的依赖:

1
2
3
4
5
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>8.5.11</version>
</dependency>

在ServerApplication里初始化时调用执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.flywaydb.core.Flyway;

@SpringBootApplication
public class ServerApplication {

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

@Bean
CommandLineRunner init() {

return (args) -> {
// 注意写代码时不要这要暴露敏感配置,这里仅仅是为了方便测试演示
Flyway flyway = Flyway.configure().dataSource(
"jdbc:mysql://localhost:3306/test?useSSL=true&useUnicode=true&characterEncoding=UTF-8",
"root",
"inputYourDbPassword"
).load();
flyway.migrate();
};
}

}

 根据Flyway快速上手教程src/main/resources/db/migration里创建一个V1__create_user.sql文件。
1
2
3
4
5
6
7
8
9
10
CREATE TABLE IF NOT EXISTS `USER`(
`USER_ID` INT(11) NOT NULL AUTO_INCREMENT,
`USER_NAME` VARCHAR(100) NOT NULL COMMENT '用户姓名',
`AGE` INT(3) NOT NULL COMMENT '年龄',
`CREATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`CREATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',
`UPDATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UPDATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',
PRIMARY KEY (`USER_ID`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

 然后执行发现报错:org.flywaydb.core.api.FlywayException: No database found to handle,检查了一下数据库地址应该没错,所以google了一下,发现github issue里有讨论,里面的讨论结果是还要引入依赖flyway-mysql,所以再给在pom.xml里引入依赖:

1
2
3
4
5
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-mysql</artifactId>
<version>8.5.11</version>
</dependency>

 然后右键Maven->Reload project安装完依赖后重新运行就成功了。我也不知道是不是他们测试的旧版本,是配置了就可以自动运行,反正我是不行。