springboot2.x集成Flyway

Flyway 是一个开源的数据库迁移工具,专为管理数据库结构变更而设计,广泛应用于 Java 生态系统中,尤其与 Spring Boot、Maven、Gradle 等框架深度集成。

✅ 核心功能

  • ‌版本化迁移 ‌:通过命名规范的 SQL 脚本(如 V1__Create_user_table.sql)或 Java 类(实现 JdbcMigration)记录数据库变更。
  • ‌自动执行‌:应用启动时自动检测并按版本顺序执行未应用的迁移脚本,确保数据库始终与代码版本一致。
  • ‌校验与修复 ‌:支持校验脚本完整性,防止被篡改;提供 repair 命令修复损坏的元数据表。
  • ‌多数据库支持‌:兼容 MySQL、PostgreSQL、Oracle、SQL Server、H2 等主流关系型数据库。

📂 迁移脚本命名规范

表格

类型 命名格式 说明
SQL 迁移 V<版本>__<描述>.sql 如 V1__create_table.sql
可重复迁移 R__<描述>.sql 每次启动都会重新执行,用于视图、函数等
Java 迁移 实现 JdbcMigration 接口 适用于复杂逻辑,如数据迁移、条件判断

🔄 工作流程

  1. 应用启动时,Flyway 检查数据库中的 flyway_schema_history 表。
  2. 对比该表记录与项目中所有迁移脚本的版本。
  3. 按版本号升序执行缺失的迁移脚本。
  4. 更新元数据表,记录执行时间、状态、校验和等信息。

💡 典型应用场景

  • ‌CI/CD 流水线‌:确保测试、预发、生产环境数据库结构完全一致。
  • ‌团队协作‌:避免开发人员手动执行 DDL 导致的环境差异。
  • ‌微服务架构‌:每个服务独立管理自己的数据库迁移,解耦性强。

🛠️ 配置示例(Spring Boot)

复制代码
		<!-- flywaydb数据库维护,迁移工具 -->
		<dependency>
		    <groupId>org.flywaydb</groupId>
		    <artifactId>flyway-core</artifactId>
		</dependency>

✅ 优势对比(vs. 手动脚本)

表格

特性 Flyway 手动执行
自动化 ✅ 是 ❌ 否
版本控制 ✅ 是 ❌ 否
回滚支持 ⚠️ 有限(需手动) ✅ 可自定义
多环境支持 ✅ 是 ⚠️ 易出错
集成度 ✅ 深度集成 Java 生态 ❌ 无

⚠️ 当前存在的问题

  • ‌不支持原生回滚‌:需手动编写回滚脚本或依赖第三方工具(如 Liquibase)。
  • ‌脚本耦合性强‌:迁移脚本与业务逻辑绑定,修改历史脚本可能导致部署失败。
  • ‌复杂事务处理困难‌:跨多个数据库或分布式事务场景下需额外设计。

Flyway 通过标准化、自动化的方式,显著降低了数据库变更的风险与运维成本,是现代 Java 应用不可或缺的 DevOps 工具之一。

springboot2.x集成Flyway

如果数据库表为空:

1.引入

复制代码
		<!-- flywaydb数据库维护,迁移工具 -->
		<dependency>
		    <groupId>org.flywaydb</groupId>
		    <artifactId>flyway-core</artifactId>
		</dependency>

2.在你的项目中创建以下目录和文件:

复制代码
src/main/resources/
 └── db/ 
        └── migration/ 
                └── V1__init_schema.sql

3.写入创建表或者初始数据的sql

注:

如果有表数据,引入Flyway 是为了修改数据信息或者新增表结构

✅ 方式一:‌**推荐!使用 baselineOnMigrate=true(最安全的生产兼容方案)**‌

如果你的数据库中已有表结构,且这些表是你希望 Flyway ‌**接管并视为"版本 1"**‌ 的起点,最推荐的做法是:

application.yml 中:

复制代码
spring: 
    flyway:
        baseline-on-migrate: true
        baseline-version: 1

将V1__add_index.sql改为V2__add_index.sql

✅ ‌作用 ‌:Flyway 会自动创建 flyway_schema_history 表,并将当前数据库状态标记为版本 1,之后所有新的迁移脚本(如 V2__add_index.sql)将从版本 2 开始正常执行。

💡 ‌这是生产环境最常用、最安全的方案‌,无需删除数据,无需手动干预数据库。

相关推荐
XIAEE11 分钟前
一个即时通讯项目是怎么长出来的:(Spring Boot 3 + Vue 3 微前端 + 悟空 IM + LiveKit)
java·spring
n876518 分钟前
Playwright Java WEB UI 自动化实现框架与逻辑
java·前端·ui
Java_AI工程师18 分钟前
Spring4 / SpringBoot1.x 老项目想接入 AI?不用升级框架!3 套无痛落地方案
java·人工智能·spring boot
BBmmo18 分钟前
Java Stream 的 filter 为什么看起来没运行?
java
VimorphTech23 分钟前
Java 文件缓存实战:如何避免读到未下载完成的视频?
java·spring boot
白露与泡影40 分钟前
后端 Java 面试核心八股汇总|高频面试题 + 解析,覆盖基础到进阶
java·开发语言·面试
SL_staff1 小时前
JVS-APS 实践:用双向反馈闭环打破制造计划孤岛
java·spring cloud·全栈
\光辉岁月/1 小时前
3.包装类
java·开发语言·包装类
BeiGuTing_code1 小时前
Java动态数组(一)
java·数据结构·windows
我命由我123452 小时前
软件工程概念 - 可插拔性
java·后端·学习·java-ee·系统架构·软件工程·学习方法