跳到主要内容

R2DBC 仓库

DeepSeek V3 中英对照 R2DBC Repositories

本章节指出了 R2DBC 的存储库支持的特殊性。这建立在 使用 Spring Data 存储库 中解释的核心存储库支持之上。在阅读本章之前,您应该对其解释的基本概念有一个扎实的理解。

用法

要访问存储在关系数据库中的领域实体,您可以使用我们复杂的仓库支持,这大大简化了实现过程。为此,请为您的仓库创建一个接口。考虑以下 Person 类:

public class Person {

@Id
private Long id;
private String firstname;
private String lastname;

// … getters and setters omitted
}
java

以下示例展示了前面 Person 类的存储库接口:

public interface PersonRepository extends ReactiveCrudRepository<Person, Long> {

// additional custom query methods go here
}
java

要配置 R2DBC 仓库,你可以使用 @EnableR2dbcRepositories 注解。如果没有配置基础包,基础设施会扫描带注解的配置类所在的包。以下示例展示了如何为仓库使用 Java 配置:

@Configuration
@EnableR2dbcRepositories
class ApplicationConfig extends AbstractR2dbcConfiguration {

@Override
public ConnectionFactory connectionFactory() {
return
}
}
java

因为我们的领域仓库继承了 ReactiveCrudRepository,所以它为你提供了访问实体的响应式 CRUD 操作。在 ReactiveCrudRepository 之上,还有 ReactiveSortingRepository,它添加了类似于 PagingAndSortingRepository 的额外排序功能。使用仓库实例仅仅是将它依赖注入到客户端的问题。因此,你可以通过以下代码检索所有的 Person 对象:

@ExtendWith(SpringExtension.class)
@ContextConfiguration
class PersonRepositoryTests {

@Autowired
PersonRepository repository;

@Test
void readsAllEntitiesCorrectly() {

repository.findAll()
.as(StepVerifier::create)
.expectNextCount(1)
.verifyComplete();
}

@Test
void readsEntitiesByNameCorrectly() {

repository.findByFirstname("Hello World")
.as(StepVerifier::create)
.expectNextCount(1)
.verifyComplete();
}
}
java

前面的示例使用 Spring 的单元测试支持创建了一个应用上下文,它在测试用例中执行基于注解的依赖注入。在测试方法内部,我们使用 repository 来查询数据库。我们使用 StepVerifier 作为测试辅助工具,根据结果验证我们的预期。

结果映射

一个返回接口或DTO投影的查询方法由实际查询产生的结果支持。接口投影通常依赖于首先将结果映射到域类型,以考虑潜在的@Column类型映射,实际的投影代理使用可能部分物化的实体来暴露投影数据。

DTO 投影的结果映射取决于实际的查询类型。派生查询使用领域类型来映射结果,Spring Data 仅从领域类型上可用的属性创建 DTO 实例。不支持在 DTO 中声明领域类型上不可用的属性。

基于字符串的查询采用了一种不同的方法,因为实际的查询(特别是字段投影)和结果类型声明是紧密相连的。与使用 @Query 注解的查询方法一起使用的 DTO 投影直接将查询结果映射到 DTO 类型中。此时不会考虑域类型上的字段映射。通过直接使用 DTO 类型,你的查询方法可以受益于一种更动态的投影,这种投影不受限于领域模型。

使用多个数据库

在处理多个可能不同的数据库时,您的应用程序将需要采用不同的配置方法。提供的 AbstractR2dbcConfiguration 支持类假设有一个单一的 ConnectionFactory,从中派生出 Dialect。尽管如此,您需要自己定义一些 bean 来配置 Spring Data R2DBC,以便与多个数据库一起工作。

R2DBC 仓库需要 R2dbcEntityOperations 来实现仓库功能。一个不使用 AbstractR2dbcConfiguration 的简单配置来扫描仓库的示例如下:

@Configuration
@EnableR2dbcRepositories(basePackages = "com.acme.mysql", entityOperationsRef = "mysqlR2dbcEntityOperations")
static class MySQLConfiguration {

@Bean
@Qualifier("mysql")
public ConnectionFactory mysqlConnectionFactory() {
return
}

@Bean
public R2dbcEntityOperations mysqlR2dbcEntityOperations(@Qualifier("mysql") ConnectionFactory connectionFactory) {

DatabaseClient databaseClient = DatabaseClient.create(connectionFactory);

return new R2dbcEntityTemplate(databaseClient, MySqlDialect.INSTANCE);
}
}
java

注意,@EnableR2dbcRepositories 允许通过 databaseClientRefentityOperationsRef 进行配置。当连接到相同类型的多个数据库时,使用不同的 DatabaseClient bean 非常有用。当使用不同方言的数据库系统时,应使用 @EnableR2dbcRepositories(entityOperationsRef = …)`。