此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data Relational 3.5.2! |
R2DBC 存储库
本章指出了 R2DBC 的存储库支持的特殊性。 这建立在使用 Spring Data Repositories 中解释的核心存储库支持之上。 在阅读本章之前,您应该对其中解释的基本概念有一个很好的理解。
用法
要访问存储在关系数据库中的域实体,您可以使用我们复杂的存储库支持,这大大简化了实施。
为此,请为您的存储库创建一个接口。
考虑以下几点Person
类:
public class Person {
@Id
private Long id;
private String firstname;
private String lastname;
// … getters and setters omitted
}
以下示例显示了上述Person
类:
public interface PersonRepository extends ReactiveCrudRepository<Person, Long> {
// additional custom query methods go here
}
要配置 R2DBC 存储库,您可以使用@EnableR2dbcRepositories
注解。
如果未配置基本包,则基础架构将扫描带注释的配置类的包。
以下示例显示了如何对存储库使用 Java 配置:
@Configuration
@EnableR2dbcRepositories
class ApplicationConfig extends AbstractR2dbcConfiguration {
@Override
public ConnectionFactory connectionFactory() {
return …
}
}
因为我们的域存储库扩展了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();
}
}
前面的示例使用 Spring 的单元测试支持创建一个应用程序上下文,该上下文将基于注释的依赖注入到测试用例中。
在测试方法中,我们使用存储库来查询数据库。
我们使用StepVerifier
作为测试辅助工具,以验证我们对结果的期望。
结果映射
返回接口或 DTO 投影的查询方法由实际查询生成的结果提供支持。
接口投影通常依赖于首先将结果映射到域类型上,以考虑潜在的潜力@Column
类型映射,实际投影代理使用可能部分物化的实体来公开投影数据。
DTO 投影的结果映射取决于实际的查询类型。 派生查询使用域类型来映射结果,Spring Data 仅从域类型上可用的属性创建 DTO 实例。 不支持在 DTO 中声明域类型上不可用的属性。
基于字符串的查询使用不同的方法,因为实际查询(特别是字段投影和结果类型声明)非常接近。
DTO 投影与@Query
将查询结果直接映射到 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);
}
}
请注意@EnableR2dbcRepositories
允许通过databaseClientRef
或entityOperationsRef
.
使用各种DatabaseClient
beans 在连接到相同类型的多个数据库时很有用。
当使用方言不同的不同数据库系统时,请使用@EnableR2dbcRepositories
(实体作参考 = ...)' 相反。