20220507 5. Data Access - Retrieving Auto-generated Keys
前言
将行插入到定义了自动增量或 identity 列的表中时,INSERT
语句可能会生成键。要完全控制要生成的列名,只需注册一个 StatementFilterFunction
,它为所需的列请求生成的键。
Mono<Integer> generatedId = client.sql("INSERT INTO table (name, state) VALUES(:name, :state)")
.filter(statement -> s.returnGeneratedValues("id"))
.map(row -> row.get("id", Integer.class))
.first();
// generatedId emits the generated key once the INSERT statement has finished
控制数据库连接
使用 ConnectionFactory
Spring 通过 ConnectionFactory
获得到数据库的 R2DBC 连接。ConnectionFactory
是 R2DBC 规范的一部分,是驱动程序的常见入口点。它允许容器或框架对应用程序代码隐藏连接池和事务管理问题。作为开发人员,您无需了解有关如何连接到数据库的详细信息。
当你使用 Spring 的 R2DBC 层时,你可以使用第三方提供的连接池实现来进行自定义。一个流行的实现是 R2DBC Pool ( r2dbc-pool
)。Spring 发行版中的实现仅用于测试目的,不提供池化。
配置 ConnectionFactory
:
- 从
ConnectionFactory
获取连接 - 提供 R2DBC URL
以下示例显示了如何配置 ConnectionFactory
:
ConnectionFactory factory = ConnectionFactories.get("r2dbc:h2:mem:///test?options=DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
使用 ConnectionFactoryUtils
ConnectionFactoryUtils
类是一种方便的和强大的辅助类,提供 static
方法,可以从 ConnectionFactory
获得和关闭连接。
它支持订阅者 Context
绑定的连接,例如 R2dbcTransactionManager
使用 SingleConnectionFactory
SingleConnectionFactory
类实现 DelegatingConnectionFactory
接口,包装了一个 Connection
,此连接每次使用后不会被关闭。
如果任何客户端代码在基于池连接的情况下调用 close
(如使用持久层工具时),则应将 suppressClose
属性设置为 true
。此设置返回包装物理连接的关闭抑制代理。请注意,您不能再将其转换为原生 Connection
或类似对象。
SingleConnectionFactory
主要是一个测试类,如果您的 R2DBC 驱动程序允许使用,则可用于特定要求,例如流水线。与池化 ConnectionFactory
相比,它始终重用相同的连接,避免过度创建物理连接。
使用 TransactionAwareConnectionFactoryProxy
TransactionAwareConnectionFactoryProxy
是目标 ConnectionFactory
的代理。代理包装该目标 ConnectionFactory
以添加对 Spring 管理事务的感知。
如果您使用未与 Spring 的 R2DBC 支持集成的 R2DBC 客户端,则需要使用此类。这样的话,您仍然可以使用这个客户端,同时让这个客户端参与 Spring 管理的事务。通常最好将具有适当访问权限的 R2DBC 客户端集成到
ConnectionFactoryUtils
资源管理中。
使用 R2dbcTransactionManager
R2dbcTransactionManager
类是单 R2DBC 数据源的 ReactiveTransactionManager
实现。它将来自指定连接工厂的 R2DBC 连接绑定到订阅者 Context
,可能允许每个连接工厂有一个订阅者连接。
需要通过 ConnectionFactoryUtils.getConnection(ConnectionFactory)
而不是 R2DBC 的标准 ConnectionFactory.create()
检索 R2DBC 连接。
所有框架类(例如 DatabaseClient
)都隐式地使用此策略。如果不与此事务管理器一起使用,查找策略的行为与常见策略完全相同。因此,它可以在任何情况下使用。
R2dbcTransactionManager
类支持应用于连接的自定义隔离级别。