Spring Data 2020.0 - Spring Data JDBC 2.1 的新功能與值得注意之處

工程 | Jens Schauder | 2020 年 11 月 10 日 | ...

作為 Spring Data 2020.0.0 版本的一部分,我們發布了 Spring Data JDBC 2.1。 本文介紹了此版本中最有趣的四個變更。

#在實體建構子參數上使用 @Value

在某些情況下,並非所有進入實體的資料都來自查詢的 ResultSet。 您現在可以使用帶有 SPeL 表達式的 @Value 註解,該表達式將被評估,並且結果在建構實體時作為參數傳遞。

class WithAtValue {

  private final @Id Long id;
  private final @Transient String computed;

 WithAtValue(Long id,
      @Value("#root.first_name") String computed) {
    this.id = id;
    this.computed = computed;
  }
}

該範例存取了 ResultSet 中的 first_name 欄位,但 SPeL 環境也存取了完整的應用程式環境。 因此,您有一種靈活的方式來自訂實體的實例化。

RowMapper 和 ResultSetExtractor 作為 Bean

當您使用 @Query 指定要為儲存庫方法執行的查詢時,您可以選擇性地提供 RowMapperResultSetExtractor 實作的類型。 但是,由於從這些類型建立的實例不是 Spring Bean,因此它們不參與依賴注入。 因此,您無法將您可能想要使用的其他資源注入到其中。

您現在可以指定對實作 RowMapperResultSetExtractor 的 Bean 的引用,方法是在 @Query 中使用 rowMapperRefresultSetExtractorRef 屬性。

interface CarRepository extends CrudRepository<Car, Long> {

  @Query(value = "select * from car", resultSetExtractorRef = "carResultSetExtractorBean")
  List<Car> findByNameWithResultSetExtractor();

  @Query(value = "select model from car", rowMapperRef = "customRowMapperBean")
  List<String> findByNameWithRowMapperBean();
}

Spring Data JDBC 通過名稱在應用程式環境中查找 Bean。 由於它們是普通的 Spring Bean,因此您可以自由地注入其他 Bean,或者真正地使用 Spring Framework 提供的任何功能。

改善實體的效能

Spring Data JDBC 實體可以通過建構子、setter 或 (對於不可變的實體) 使用 with-method 來設定其屬性。 但是,如果屬性已經由建構子設定,則不應由 setter 或 (可能更糟) with-method 設定。 這避免了方法呼叫和可能的實例建立的成本。 但是,為此,Spring Data JDBC 過去會檢查每個屬性,以查看它是否具有匹配的建構子參數。 此測試非常昂貴,可以通過檢查一次是否存在所有參數建構子來避免。 在這種情況下,根本不需要呼叫任何 setter。 使用最新版本,Spring Data JDBC 完全做到了這一點,從而提高了具有所有參數建構子的實體的效能。 因此,一個新的效能技巧是提供所有參數建構子。

支援 Oracle 的時間類型

Spring Data JDBC 從一開始就支援時間類型。 但是,當我們添加對 Oracle 的官方支援時,我們發現 Oracle 對於時間類型返回了一種特殊的專有類型,Spring Data JDBC 無法將其轉換為正常的時間類型 (例如 java.time.Instant 或類似類型)。

在此版本中,我們添加了對轉換的支援。 使用時間資料類型不應比使用任何其他資料庫在 Oracle 上引起更多問題。 它們仍然可能因時區和日光節約時間的力量而引起麻煩,但這不是我們要解決的問題。

在我們開發下一個版本時,請享受這些新功能。

取得 Spring 電子報

隨時掌握 Spring 電子報的最新資訊

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將舉辦的活動

查看 Spring 社群中所有即將舉辦的活動。

檢視全部