# version-upgrade
**Repository Path**: alex200816/version-upgrade
## Basic Information
- **Project Name**: version-upgrade
- **Description**: 简单易用的版本升级工具,支持SQL脚本执行和Java代码执行,提供自动回滚功能,可集成到任何Java项目
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2024-08-25
- **Last Updated**: 2026-05-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 版本升级工具
一个简单易用的版本升级工具,支持SQL脚本执行和Java代码执行,提供自动回滚功能,可集成到任何Java项目。
## 特性
- ✅ **零配置版本号**:无需配置版本号,程序自动读取和管理
- ✅ **自动版本检测**:自动读取本地当前版本
- ✅ **智能版本计算**:自动计算需要升级的版本,支持跨版本升级
- ✅ **多步骤执行**:支持SQL和Java混合执行,按顺序执行
- ✅ **自动回滚**:升级失败时自动执行回滚步骤
- ✅ **参数传递**:支持向Java代码传递参数
- ✅ **Spring Boot支持**:可在Spring Boot启动前自动执行
- ✅ **缓存优化**:SQL脚本自动缓存,避免重复读取
## 快速开始
### 1. 添加依赖
```xml
cn.002alex
version-upgrade
2.0.0
```
### 2. 创建文件结构
```
src/main/resources/
└── version/
├── version.xml # 版本配置文件
└── sql/ # SQL脚本目录
├── 1.0.1.sql
└── 1.0.2.sql
```
### 3. 配置 version.xml
```xml
1.0.0
2024-01-01 00:00:00
初始版本发布
1.0.1
2024-02-01 00:00:00
新增用户表
1.0.1.sql
1.0.2
2024-03-01 00:00:00
数据迁移
com.example.upgrade.DataMigration
1.0.3
2024-04-01 00:00:00
订单模块重构
com.example.upgrade.BackupOrders
1.0.3_create_table.sql
1.0.3_init_data.sql
com.example.upgrade.InitOrders
rollback_1.0.3.sql
com.example.upgrade.RestoreOrders
```
### 4. 一行代码搞定
#### 普通Java项目
```java
public class Application {
public static void main(String[] args) {
// 一行代码搞定!不需要配置版本号
VersionUpgradeEngine.builder()
.dataSource(dataSource) // 如果需要执行SQL
.upgrade(); // 自动读取本地版本,自动升级到最新版
}
}
```
#### Spring Boot项目
在启动类上添加 `@EnableVersionUpgrade` 注解:
```java
@SpringBootApplication
@EnableVersionUpgrade
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
```
## 生命周期
### 完整流程图

### 两种启动模式
| 模式 | 使用方式 |
| ----------------- | ------------------------------------- |
| **Spring Boot** | 引入依赖后自动通过 ApplicationRunner 触发,无需手动调用 |
| **非 Spring Boot** | 手动创建 Engine 实例并调用 `upgrade()` 方法 |
### 监听器与处理器触发时机
#### 升级监听器 (VersionUpgradeListener)
| 方法 | 触发时机 |
| ---------------------------- | --------- |
| `onUpgradeStart()` | 开始升级前 |
| `onVersionUpgradeStart()` | 每个版本开始升级前 |
| `onStepUpgradeStart()` | 每个步骤开始执行前 |
| `onStepUpgradeComplete()` | 步骤执行成功 |
| `onVersionUpgradeComplete()` | 版本升级成功 |
| `onUpgradeComplete()` | 全部升级完成 |
#### 异常监听器 (VersionExceptionListener)
| 方法 | 触发时机 |
| -------------------------- | ----------- |
| `onStepUpgradeException()` | 步骤执行失败 |
| `onUpgradeException()` | 版本升级过程中发生异常 |
#### 回滚监听器 (VersionRollbackListener)
| 方法 | 触发时机 |
| ----------------------------- | -------- |
| `onRollbackStart()` | 回滚开始 |
| `onVersionRollbackStart()` | 版本回滚开始 |
| `onStepRollbackStart()` | 每个回滚步骤开始 |
| `onStepRollbackComplete()` | 回滚步骤成功 |
| `onVersionRollbackComplete()` | 版本回滚完成 |
| `onRollbackComplete()` | 全部回滚完成 |
| `onRollbackException()` | 回滚步骤失败 |
#### 处理器 (VersionUpgradeHandler)
| 方法 | 触发时机 |
| ------------------ | ------------- |
| `handle()` | JAVA 类型步骤执行 |
| `beforeRollback()` | 回滚开始前 |
| `afterRollback()` | 回滚完成后 |
| `rollback()` | JAVA 类型回滚步骤执行 |
## 详细配置
### XML配置说明
| 标签 | 说明 | 必填 |
| ----------------- | ------ | -- |
| `` | 版本号 | 是 |
| `` | 发布时间 | 否 |
| `` | 更新说明 | 否 |
| `` | 执行步骤集合 | 否 |
| `` | 单个执行步骤 | 否 |
| `` | 回滚步骤集合 | 否 |
### step标签属性
| 属性 | 说明 | 可选值 |
| -------------- | ----------------------- | ------------------------ |
| `type` | 执行类型 | `SQL` / `JAVA` |
| `invokeParams` | 传递给Java的参数(仅type=JAVA时) | key1=value1\&key2=value2 |
### step标签值
- type=SQL时:SQL脚本文件名(放在version/sql/目录下)
- type=JAVA时:Java类全限定名
### 自定义Java处理器
实现 `VersionUpgradeHandler` 接口:
```java
@Slf4j
public class DataMigration implements VersionUpgradeHandler {
@Override
public void handle(VersionXml.Step step, VersionXml versionXml) {
log.info("开始数据迁移...");
log.info("当前版本: {}", versionXml.getVersion());
// 解析参数
if (step != null && step.getInvokeParams() != null) {
String params = step.getInvokeParams();
log.info("接收参数: {}", params);
}
// 执行迁移逻辑
// ...
log.info("数据迁移完成");
}
@Override
public void rollback(VersionXml.Step step, VersionXml versionXml) {
log.info("开始回滚版本: {}", versionXml.getVersion());
// 执行回滚逻辑
}
}
```
Spring Boot项目中,直接使用 `@Component` 注解即可自动注册。
## 高级配置
### 传递参数给Java代码
```xml
1.0.7
2024-07-01 00:00:00
批量数据处理
com.example.BatchProcess
```
**Java 代码接收参数**:
```java
@Slf4j
public class BatchProcess implements VersionUpgradeHandler {
@Override
public void handle(VersionXml.Step step, VersionXml versionXml) {
if (step != null && step.getInvokeParams() != null) {
String params = step.getInvokeParams();
Map paramMap = parseParams(params);
String batchSize = paramMap.get("batchSize");
String mode = paramMap.get("mode");
log.info("批次大小: {}, 模式: {}", batchSize, mode);
}
}
}
```
### 条件执行
```xml
1.0.9
2024-09-01 00:00:00
根据环境决定是否升级
ENV
ENABLE_NEW_FEATURE
true
eq
1.0.9.sql
```
## 回滚机制
当某个版本升级失败时:
1. 立即停止后续版本的升级
2. 自动执行该版本的 ``(如果配置了)
3. 本地版本号保持为上次成功升级的版本
## 完整配置示例
```xml
1.0.0
2024-01-01 00:00:00
系统初始版本
1.0.1
2024-02-01 00:00:00
新增用户表索引
1.0.1.sql
1.0.2
2024-03-01 00:00:00
执行缓存预热
com.example.upgrade.CacheWarming
1.0.3
2024-04-01 00:00:00
新增订单表并初始化
1.0.3.sql
com.example.upgrade.OrderInit
1.0.4
2024-05-01 00:00:00
危险的数据操作,需要配置回滚
1.0.4.sql
rollback_1.0.4.sql
com.example.upgrade.RestoreData
1.0.5
2024-06-01 00:00:00
性能优化
```
## 最佳实践
1. **小步快跑**:每个版本尽量做小的改动,便于问题定位
2. **详细描述**:每个版本的 description 要写清楚改动内容
3. **及时回滚**:涉及数据的操作一定要配置回滚步骤
4. **测试环境验证**:正式环境升级前先在测试环境验证
5. **日志记录**:重要操作要在 description 中记录,便于问题排查
## 常见问题
### Q1: SQL 文件放哪里?
**A**: 放在 `src/main/resources/version/sql/` 目录下
### Q2: 升级失败会自动回滚吗?
**A**: 如果配置了 `rollbackSteps`,会自动执行回滚
### Q3: Java 代码怎么接收参数?
**A**: 通过 `step.getInvokeParams()` 方法获取
### Q4: 可以同时执行多个步骤吗?
**A**: 可以,在 `` 中配置多个 `` 即可,按顺序执行
### Q5: 如何在Spring Boot中注册自定义处理器?
**A**: 使用 `@Component` 注解,框架会自动扫描注册
### Q6: 支持跨版本升级吗?
**A**: 支持,例如从1.0.2升级到1.0.5会自动执行1.0.3 → 1.0.4 → 1.0.5