从零搭建开发脚手架SpringBoot集成Flyway实现数据库版本管理本文转载请联系Java大厂面试官公众号。飞路是什么?Flyway的集成与使用添加依赖配置文件脚本测试原理基于Java的高级迁移回调什么是Flyway?Flyway是一款支持数据库版本自动升级的数据库版本控制管理工具。项目初始化时,往往需要先手动执行数据库脚本。在开发过程中,当数据结构或数据更新时,往往需要手动执行脚本来同步开发环境和测试环境。现在我们可以使用flyway来帮助我们自动完成这项工作。Flyway集成及使用添加依赖org.flywaydbflyway-core由于是SpringBoot项目集成,版本直接使用默认配置文件即可spring:flyway:#是否开启flyway,默认为trueenabled:true#迁移时发现目标schema非空,且没有元数据表,(即迭代中的item)是否开启自动执行基线迁移,默认false。baseline-on-migrate:true#是否允许乱序迁移,默认false,建议打开开发环境,关闭乱序productionenvironment:true#设置SQL脚本的目录,可以配置多个,比如classpath:db/migration,filesystem:/sql-migrations,默认classpath:db/migrationlocations:-classpath:db/migration更多参数见https://flywaydb.org/documentation/configfiles”这些参数在springboot2项目中配置,需要添加spring前缀脚本在resource目录下创建db.migration目录,放置sql文件,sql脚本格式:V/R+版本号+双下划线+description+terminator:例如:V20190429.1530__t_user_update.sql(开发环境:建议日期+时分秒)例如:V1.1__init.sql(生产环境:建议以上步骤结合版本号)测试默认情况下,SpringBoot会在应用启动时自动运行Flyway数据库迁移。结果如下:注:Flyway社区版不支持MySQL5.7以下版本https://flywaydb.org/documentation/database/mysql原理Flyway需要先在DB中创建一个metdata表(默认表名为flyway_schema_history),该表中保存了每一次迁移的一条记录,其中包含了迁移脚本的版本号和SQL脚本的校验值。当扫描到新的SQL脚本时,Flyway会解析SQL脚本的版本号,并结合元数据表执行迁移对比,如果SQL脚本版本较新,则SQL文件会在指定的DB上执行,否则SQL文件将被跳过。两个flyway版本号的比较采用左对齐的原则,缺的用0代替。例如:1.2.9.4高于1.2.9。1.2.10高于1.2.9.4。1.2.10与1.2.010的版本相同。每个版本号的前导0将被忽略。FlywaySQLFiles可以分为两类:Versioned:用于版本升级,每个版本都有唯一的版本号,只能应用一次Repeatable:指的是可以重复加载的迁移,一旦SQL脚本的checksum发生变化,flyway将重新应用脚本。它不用于版本更新。这种类型的迁移总是在执行版本化迁移之后执行。默认情况下,MigrationSQL的命名规则如下:img文件名由以下部分组成,除默认配置外,部分部分还可以自定义规则。prefix:可配置,前缀标识,默认值V表示Versioned,R表示Repeatableversion:标识版本号,由一个或多个数字组成,数字之间的分隔符可以是点号。或者下划线_分隔符:可配置,用于分隔版本标识和描述信息,默认为两个下划线__描述:描述信息,文本可以用下划线或空格分隔*Flyway的元数据a表结果如下:CREATETABLEflyway_schema_history(installed_rankINTNOTNULL,versionVARCHAR(50),descriptionVARCHAR(200)NOTNULL,typeVARCHAR(20)NOTNULL,scriptVARCHAR(1000)NOTNULL,checksumINT,installed_byVARCHAR(100)NOTNULL,installed_onTIMESTAMPDEFAULTCURRENT_TIMESTAMP,execution_timeINTNOTNULL,successTINYINT(1)NOTNULL,PRIMARYKEY(installed_rank),INDEXflyway_schema_history_s_idx(success))ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;基于Java的高级迁移回调Flyway使我们能够使用两种不同的方法(Java或SQL)创建回调,前者是最灵活的方法。它给了我们执行任意代码的自由。核心代码如下:;进口组织。flywaydb.core.internal.jdbc.JdbcTemplate;importorg.springframework.context.annotation.Configuration;importjava.sql.SQLException;@Configuration@Slf4jpublicclassExampleFlywayCallbackextendsBaseCallback{@Overridepublicvoidhandle(Eventevent,Contextcontext){switch(event){//每次成功后触发移民。此事件将在与迁移相同的事务中触发caseAFTER_EACH_MIGRATE:log.info("{},",event);finalJdbcTemplatejdbcTemplate=newJdbcTemplate(context.getConnection());//创建10个随机用户for(inti=1;i<=10;i++){try{jdbcTemplate.execute(String.format("insertintotest_user"+"(username,first_name,last_name)values"+"('%d@reflectoring.io','Elvis_%d','Presley_%d')",i,i,i));}catch(SQLExceptionthrowables){throwables.printStackTrace();}}}}}我们可以在Java迁移回调中执行任何我们需要的逻辑,我们可以灵活的实现更多的异常需求。参考:https://www.cnblogs.com/harrychinese/p/springboot_flyway.htmlhttps://blog.csdn.net/qq_38455201/article/details/103493041