R2DBC 倉庫
本章重點介紹 R2DBC 倉庫支援的特點。這建立在使用 Spring Data 倉庫中解釋的核心倉庫支援之上。在閱讀本章之前,您應該對其中解釋的基本概念有紮實的理解。
用法
要訪問儲存在關係資料庫中的領域實體,您可以使用我們複雜的倉庫支援,這可以顯著簡化實現。為此,請為您的倉庫建立一個介面。考慮以下 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 中宣告領域型別上不可用的屬性。
基於字串的查詢採用不同的方法,因為實際查詢,特別是欄位投影和結果型別宣告,是緊密相關的。與 @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);
}
}
請注意,@EnableR2dbcRepositories 允許透過 databaseClientRef 或 entityOperationsRef 進行配置。當連線到多個相同型別的資料庫時,使用不同的 DatabaseClient bean 會很有用。當使用方言不同的不同資料庫系統時,請改用 @EnableR2dbcRepositories(entityOperationsRef = …) `。