跳到主要内容

整合Spring事务

整合Spring事务

Jimmer中所有数据库操作API都有两种执行方式:

  • 在指定的JDBC连接上执行

  • 无需指定JDBC连接即可执行,但需要为Jimmer配置ConnectionManager,教会Jimmer如何租借和归还连接。

请参考

以了解更多。

所以,Jimmer本身并未提供连接/事务管理能力,这种管理能力完全依赖用户对ConnectionManager的定制,ConnectionManager就是将Jimmer和任何IOC框架 (当然,包括Spring) 的连接/事务管理能力整合在一起的关键点。

使用Spring Boot starter

如果使用Jimmer提供的Spring Boot Starter,则不用做任何工作,Jimmer会自动接入Spring的事务管理机制。

不使用Spring Boot Starter

如果仅使用Spring,并未使用Jimmer提供的Spring Boot Starter。那么需要自己编码将Jimmer接入Spring的事务管理机制。

开发人员需要创建JSqlClient/KSqlClient,并设置其ConnectionManager,在ConnectionManager中,利用Spring的org.springframework.jdbc.datasource.DataSourceUtils打开和关闭连接。

Book.java
@Bean
public JSqlClient sqlClient(DataSource dataSource) {
return JSqlClient.newBuilder()
.setConnectionManager(
new ConnectionManager() {
@Override
public <R> R execute(
Function<Connection, R> block
) {
Connection con = DataSourceUtils
.getConnection(dataSource);
try {
return block.apply(con);
} finally {
DataSourceUtils
.releaseConnection(con, dataSource);
}
}
}
)
...省略其他配置...
.build();
}
警告

不要使用普通的方法从连接池借用 (dataSource.getConnection) 和归还 (con.close) 连接, 一定要使用Spring的org.springframework.jdbc.datasource.DataSourceUtils,因为这可以和Spring的事务管理机制相结合。

和JdbcTemplate协同

Jimmer采用极简设计,其API总入口JSqlClient/KSqlClient对外暴露的API一律采用无状态设计。

很多数据库操作框架对JDBC连接提供了一个轻量级有状态包装,比如

并且对数据库事务也有有状态封装,比如

Jimmer没有类似的抽象,其API总入口JSqlClient/KSqlClient对外暴露的API一律采用无状态设计,JDBC连接是Jimmer唯一的底层依赖。

提示

这促成了一个重要的特性:Jimmer的事务管理和JdbcTemplate的事务管理完全相同。

Jimmer无需提供任何类似于createNativeQuery的API

  • 对于和ORM关系不大的报表查询,用户期望书写完整的Native SQL,那么直接使用Spring的JdbcTemplate即可,这是因为Jimmer的事务管理和JdbcTemplate的事务管理完全相同。

  • 对于Jimmer的ORM风格查询,在强类型SQL DSL中混入Native SQL表达式即可

多数据源

上文我们讨论的是单数据源场景下的Spring事务整合,至于多数据源,请查看这里