跳到主要内容

4.1 Spring Boot 完整集成

Maven 依赖

<dependency>
<groupId>top.dlzio</groupId>
<artifactId>dlz-db-spring-boot-starter</artifactId>
<version>8.0.0</version>
&lt;/dependency>

&lt;!-- 由应用显式提供 Spring JDBC;版本跟随 Spring Boot Parent/BOM -->
&lt;dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
&lt;/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&lt;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&lt;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_NEWNESTED 等语义时使用 Spring 原生事务能力。

数据源边界

  • 普通 @Transactional 绑定的是事务管理器对应的数据源,不会自动跟随 DB.ds.use(name, ...) 切换;
  • 在命名数据源上建立本地事务,使用 DB.tx.run(name, ...)
  • 一次 DB.tx.run(name, ...) 只管理一个数据源,不是跨数据源分布式事务;
  • 异步线程不会自动继承当前线程的数据库连接和事务上下文。

通用的数据源注册和编程式事务说明见 3.7 事务与多数据源