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 开始正常执行。

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

相关推荐
学长毕设12 分钟前
基于SpringBoot的游乐园管理系统-附源码
java·spring boot·后端
SimonKing40 分钟前
震惊:怎么回事,opencode一轮对话耗尽免费额度
java·后端·程序员
装不满的克莱因瓶43 分钟前
【SpringAI Alibaba】ReactAgent响应SSE实时流式传输案例实战
java·人工智能·ai·sse·springai
杨凯凡1 小时前
Spring Boot 文件上传怎么做才安全?流式落盘、路径校验与数据库一致性实战
java·spring boot·文件上传·后端安全·数据库一致性
这个昵称不容易1 小时前
旅游管理系统的设计与实现(SpringBoot + MySQL + Vue 前后端分离)
java·springboot·毕设
Rain的Java大神之路1 小时前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
天天被压力2 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
天天被压力2 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
Wang's Blog11 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain12 小时前
C++转Java日记(03)
java·开发语言·c++