Spring Boot 全 YAML 配置 Liquibase 教程
一、项目初始化配置
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 的版本控制能力,可有效提升团队协作效率和系统稳定性。