一、項目初始化配置
1.1 創建 Spring Boot 項目
通過 Spring Initializr 生成基礎項目,配置如下:
- ??Project??: Maven
- ??Language??: Java
- ??Spring Boot??: 3.5.3(最新穩定版)
- ??Project Metadata??:
- Group:
com.example
- Artifact:
liquibase-demo
- Package name:
com.example.liquibasedemo
- Group:
- ??Dependencies??:
- Spring Web
- Spring Data JPA
- MySQL Driver
- Liquibase Migration
1.2 項目結構
src
├── main
│ ├── java
│ │ └── com.example.liquibasedemo
│ │ ├── config
│ │ ├── controller
│ │ ├── model
│ │ └── LiquibaseDemoApplication.java
│ └── resources
│ ├── application.yml
│ └── db
│ └── changelog
│ ├── db.changelog-master.yaml
│ └── changes
│ ├── create-user-table.yaml
│ └── add-age-column.yaml
二、YAML 配置體系
2.1 數據庫連接配置
src/main/resources/application.yml
:
spring:datasource:url: jdbc:mysql://localhost:3306/liquibase_demo?useSSL=false&serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverjpa:hibernate:ddl-auto: none # 禁用自動 DDLshow-sql: trueliquibase:change-log: classpath:db/changelog/db.changelog-master.yaml
server:port: 8080
2.2 多環境配置(可選)
創建環境專用配置文件:
src/main/resources/
├── application.yml # 主配置
├── application-dev.yml # 開發環境
└── application-prod.yml # 生產環境
激活環境配置:
spring:profiles:active: dev
三、Liquibase YAML 變更日志
3.1 主變更日志文件
db/changelog/db.changelog-master.yaml
:
databaseChangeLog:- include:file: db/changelog/changes/create-user-table.yamlrelativeToChangelogFile: true- include:file: db/changelog/changes/add-age-column.yamlrelativeToChangelogFile: true
3.2 用戶表創建變更集
db/changelog/changes/create-user-table.yaml
:
databaseChangeLog:- changeSet:id: 1author: yournamechanges:- createTable:tableName: userscolumns:- column:name: idtype: INTautoIncrement: trueconstraints:primaryKey: truenullable: false- column:name: nametype: VARCHAR(100)constraints:nullable: false- column:name: emailtype: VARCHAR(100)constraints:unique: true- column:name: created_attype: TIMESTAMPdefaultValueComputed: CURRENT_TIMESTAMPconstraints:nullable: false
3.3 添加年齡列變更集
db/changelog/changes/add-age-column.yaml
:
databaseChangeLog:- changeSet:id: 2author: yournamechanges:- addColumn:tableName: userscolumns:- column:name: agetype: INTdefaultValue: 18
四、代碼集成與驗證
4.1 實體類定義
src/main/java/com/example/liquibasedemo/model/User.java
:
@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(nullable = false)private String name;@Column(unique = true)private String email;@Column(nullable = false)private Integer age;// Getters/Setters
}
4.2 數據操作驗證
@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserRepository userRepository;@PostMappingpublic User createUser(@RequestBody User user) {return userRepository.save(user);}@GetMappingpublic List<User> getAllUsers() {return userRepository.findAll();}
}
4.3 啟動驗證
mvn spring-boot:run
觀察控制臺輸出:
INFO 12345 --- [ main] l.e.LiquibaseLoggingListener : Starting Liquibase at 10:00:00 (version 4.23.0)
INFO 12345 --- [ main] l.e.LiquibaseLoggingListener : ChangeSet db/changelog/changes/create-user-table.yaml::1::yourname executed successfully
五、高級功能實現
5.1 回滾配置
在變更集中添加回滾邏輯:
- changeSet:id: 3author: yournamechanges:- createTable:tableName: orderscolumns:- column:name: idtype: INTautoIncrement: trueconstraints:primaryKey: truenullable: falserollback:- dropTable:tableName: orders
5.2 條件變更
- changeSet:id: 4author: yournamepreConditions:- onFail: MARK_RANdbms: mysqlchanges:- createIndex:tableName: usersindexName: idx_emailcolumn:name: email
5.3 多環境數據初始化
db/changelog/changes/init-data.yaml
:
databaseChangeLog:- changeSet:id: 5author: yournamecontext: devchanges:- insert:tableName: userscolumns:- column:name: namevalue: "Test User"- column:name: emailvalue: "test@example.com"- column:name: agevalue: 25
六、最佳實踐指南
-
??版本控制規范??
- 使用語義化版本號(如
1.0.0
) - 每個變更集對應單一業務變更
- 變更集文件按版本順序編號
- 使用語義化版本號(如
-
??變更集設計原則??
- changeSet:id: 6author: yournamechanges:- sqlFile:path: classpath:db/migration/V2__add_address_column.sqlrelativeToChangelogFile: true
-
??安全配置??
spring:liquibase:contexts: devlabels: feature-user-modulerollbackCount: 3
七、常見問題解決方案
問題現象 | 解決方案 | 參考來源 |
---|---|---|
變更集未執行 | 檢查 DATABASECHANGELOG 表記錄 | |
YAML格式錯誤 | 使用在線YAML驗證工具 | |
數據庫鎖等待 | 添加 liquibase.lock.timeout=600 | |
多環境沖突 | 使用 spring.profiles.active 隔離配置 |
八、完整項目結構示例
liquibase-demo/
├── src/
│ ├── main/
│ │ ├── java/
│ │ └── resources/
│ │ ├── application.yml
│ │ └── db/
│ │ └── changelog/
│ │ ├── db.changelog-master.yaml
│ │ └── changes/
│ │ ├── create-user-table.yaml
│ │ └── add-age-column.yaml
├── pom.xml
└── .gitignore
通過本教程,您可以完全使用 YAML 配置實現 Spring Boot 項目的數據庫遷移管理。YAML 的層級結構能清晰展現數據庫變更歷程,配合 Liquibase 的版本控制能力,可有效提升團隊協作效率和系統穩定性。