4.1 Spring Boot 完整集成
Maven 依赖
<dependency>
<groupId>top.dlzio</groupId>
<artifactId>dlz-db-spring-boot-starter</artifactId>
<version>8.0.0</version>
</dependency>
<!-- 由应用显式提供 Spring JDBC;版本跟随 Spring Boot Parent/BOM -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
Starter 中的 Spring JDBC 和自动配置依赖使用 provided 范围,不会传递给应用,因此必须显式引入 spring-boot-starter-jdbc。Starter 库以 Java 8 为编译目标;Spring Boot 2 应用可运行在 JDK 8+,Spring Boot 3 应用本身要求 JDK 17+。数据库驱动由应用按实际数据库引入。
完整 yaml 配置
# application.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
dlz:
db:
# 逻辑删除字段名
logic-delete-field: deleted
# 预设 SQL 文件路径(classpath 下的通配符)
sqllist: [app/*]
# 是否使用数据库中的预设 SQL
use-db-sql: false
# 辅助功能
helper:
# 自动更新表结构
auto-update: false
# 扫描的包名
package-name: com.example.entity
# 日志
log:
show-result: false
show-run-sql: true
show-caller: true
自动装配
无需编写 Java 配置类。SpringDlzDbAutoConfiguration 会自动完成:
- 将
dlz.db.*绑定到com.dlz.db.core.DlzDbProperties; - 注册动态
JdbcTemplate、SQL 执行器和事务执行器; - 使用应用中的
DataSource初始化 DLZ-DB。
Spring Boot 2 通过 META-INF/spring.factories 加载,Spring Boot 3 通过 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 加载。
运行机制
Starter 使用应用已有的 DataSource 初始化 DLZ-DB,SQL 执行复用 Spring JDBC,事务执行复用 Spring 当前线程绑定的连接。业务代码不需要创建、继承或注入 DLZ-DB 的底层适配器。
事务
声明式事务
在 Spring 管理的 Bean 上使用 @Transactional:
@Service
public class OrderService {
@Transactional(rollbackFor = Exception.class)
public void createOrder(Order order, List<OrderItem> items) {
DB.pojo.insert(order);
for (OrderItem item : items) {
item.setOrderId(order.getId());
DB.pojo.insert(item);
}
}
}
DLZ-DB 会复用 Spring 当前事务绑定的连接。传播行为、只读事务和回滚规则由 Spring 管理:
@Transactional(readOnly = true)
public List<User> findAll() {
return DB.pojo.selectWrapper(User.class).queryBeanList();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void runInNewTransaction() {
// Spring 管理新的事务边界
}
编程式事务
DB.tx.run(() -> {
DB.pojo.insert(order);
DB.pojo.insert(orderItem);
});
DB.tx.run("report", () -> {
DB.jdbc.execute("UPDATE report_task SET status = ? WHERE id = ?", 1, id);
});
DB.tx.run 只承诺 REQUIRED 式的加入语义,不等同于 Spring @Transactional 的全部传播选项。需要 REQUIRES_NEW、NESTED 等语义时使用 Spring 原生事务能力。
数据源边界
- 普通
@Transactional绑定的是事务管理器对应的数据源,不会自动跟随DB.ds.use(name, ...)切换; - 在命名数据源上建立本地事务,使用
DB.tx.run(name, ...); - 一次
DB.tx.run(name, ...)只管理一个数据源,不是跨数据源分布式事务; - 异步线程不会自动继承当前线程的数据库连接和事务上下文。
通用的数据源注册和编程式事务说明见 3.7 事务与多数据源。