本章指出了 R2DBC 的存储库支持的特性。 这建立在使用 Spring 数据存储库中解释的核心存储库支持之上。 在阅读本章之前,您应该对其中解释的基本概念有充分的了解。Spring中文文档

用法

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

Sample Person 实体
public class Person {

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

  // … getters and setters omitted
}

下面的示例显示了上一个类的存储库接口:PersonSpring中文文档

用于持久化 Person 实体的基本存储库接口
public interface PersonRepository extends ReactiveCrudRepository<Person, Long> {

  // additional custom query methods go here
}

要配置 R2DBC 存储库,您可以使用注释。 如果未配置基本包,基础结构将扫描带批注的配置类的包。 以下示例演示如何对存储库使用 Java 配置:@EnableR2dbcRepositoriesSpring中文文档

存储库的 Java 配置
@Configuration
@EnableR2dbcRepositories
class ApplicationConfig extends AbstractR2dbcConfiguration {

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

由于我们的域存储库扩展了 ,它为您提供了响应式 CRUD 操作来访问实体。 除了 之外,还有 ,它添加了类似于 的附加排序功能。 使用存储库实例只是一个依赖关系问题,将其注入客户端。 因此,您可以使用以下代码检索所有对象:ReactiveCrudRepositoryReactiveCrudRepositoryReactiveSortingRepositoryPagingAndSortingRepositoryPersonSpring中文文档

对 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();
  }
}

前面的示例创建了一个具有 Spring 单元测试支持的应用程序上下文,该上下文执行基于注释的依赖注入到测试用例中。 在测试方法中,我们使用存储库来查询数据库。 我们用作测试辅助工具,以验证我们对结果的期望。StepVerifierSpring中文文档

结果映射

返回接口或 DTO 投影的查询方法由实际查询生成的结果支持。 接口投影通常依赖于将结果映射到域类型上,以首先考虑潜在的类型映射,而实际投影代理使用可能部分实现的实体来公开投影数据。@ColumnSpring中文文档

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

基于字符串的查询使用不同的方法,因为实际查询(特别是字段投影)和结果类型声明非常接近。 与查询方法一起使用的 DTO 投影,这些方法使用地图查询结果直接映射到 DTO 类型中。 不考虑域类型的字段映射。 直接使用 DTO 类型,查询方法可以从不限于域模型的更动态的投影中受益。@QuerySpring中文文档

使用多个数据库

使用多个可能不同的数据库时,应用程序将需要不同的配置方法。 提供的支持类假定从中派生的单个。 话虽如此,您需要自己定义一些 bean 来配置 Spring Data R2DBC 以使用多个数据库。AbstractR2dbcConfigurationConnectionFactoryDialectSpring中文文档

R2DBC 存储库需要实现存储库。 在不使用的情况下扫描存储库的简单配置如下所示:R2dbcEntityOperationsAbstractR2dbcConfigurationSpring中文文档

@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);
    }
}

请注意,允许通过 或 进行配置。 在连接到同一类型的多个数据库时,使用各种 Bean 非常有用。 使用方言不同的不同数据库系统时,请使用 (entityOperationsRef = ...)“而代之。@EnableR2dbcRepositoriesdatabaseClientRefentityOperationsRefDatabaseClient@EnableR2dbcRepositoriesSpring中文文档