R2DBC 倉庫

本章重點介紹 R2DBC 倉庫支援的特點。這建立在使用 Spring Data 倉庫中解釋的核心倉庫支援之上。在閱讀本章之前,您應該對其中解釋的基本概念有紮實的理解。

用法

要訪問儲存在關係資料庫中的領域實體,您可以使用我們複雜的倉庫支援,這可以顯著簡化實現。為此,請為您的倉庫建立一個介面。考慮以下 Person

Person 實體示例
public class Person {

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

    // … getters and setters omitted
}

以下示例顯示了前面 Person 類的倉庫介面

用於持久化 Person 實體的基本倉庫介面
public interface PersonRepository extends ReactiveCrudRepository<Person, Long> {

    // additional custom query methods go here
}

要配置 R2DBC 倉庫,您可以使用 @EnableR2dbcRepositories 註解。如果未配置基本包,則基礎設施會掃描註解配置類的包。以下示例顯示瞭如何將 Java 配置用於倉庫

倉庫的 Java 配置
@Configuration
@EnableR2dbcRepositories
class ApplicationConfig extends AbstractR2dbcConfiguration {

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

由於我們的領域倉庫擴充套件了 ReactiveCrudRepository,它為您提供了響應式 CRUD 操作來訪問實體。在 ReactiveCrudRepository 之上,還有 ReactiveSortingRepository,它添加了類似於 PagingAndSortingRepository 的額外排序功能。使用倉庫例項僅僅是將其依賴注入到客戶端的問題。因此,您可以使用以下程式碼檢索所有 Person 物件

對 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 允許透過 databaseClientRefentityOperationsRef 進行配置。當連線到多個相同型別的資料庫時,使用不同的 DatabaseClient bean 會很有用。當使用方言不同的不同資料庫系統時,請改用 @EnableR2dbcRepositories(entityOperationsRef = …) `。

© . This site is unofficial and not affiliated with VMware.