Spring Data JDBC參考文件 三

Adobe國際認證發表於2021-10-11

原標題:Spring認證|Spring Data JDBC參考文件三 (內容來源:Spring中國教育管理中心) #Spring# #java# #程式設計師#

Spring Data JDBC參考文件 三

9.6.9. 身份證生成

Spring Data JDBC 使用 ID 來標識實體。實體的 ID 必須使用 Spring Data 的@Id註解進行註解。

當您的資料庫具有用於 ID 列的自動增量列時,生成的值在將其插入資料庫後在實體中設定。

一個重要的約束是,在儲存實體後,該實體不能再是新的。請注意,實體是否是新實體是實體狀態的一部分。對於自動增量列,這會自動發生,因為 ID 由 Spring Data 使用 ID 列中的值設定。如果您不使用自增列,您可以使用一個BeforeSave監聽器,它設定實體的 ID(在本文件後面介紹)。

9.6.10. 樂觀鎖定

Spring Data JDBC 透過@Version在聚合根上註釋的數字屬性來支援樂觀鎖定 。每當 Spring Data JDBC 使用這樣的版本屬性儲存聚合時,會發生兩件事:聚合根的更新語句將包含一個 where 子句,檢查儲存在資料庫中的版本實際上未更改。如果不是這種情況,
OptimisticLockingFailureException將會丟擲一個will。此外,實體和資料庫中的 version 屬性都會增加,因此併發操作將注意到更改並丟擲一個(OptimisticLockingFailureException如果適用),如上所述。

這個過程也適用於插入新的聚合,其中 anull或0version 表示一個新例項,然後增加的例項將例項標記為不再是新的,這使得在物件構造期間生成 id 的情況下,例如當 UUID 是用過的。

在刪除過程中,版本檢查也適用,但不會增加版本。

9.7. 查詢方法

本節提供有關 Spring Data JDBC 的實現和使用的一些特定資訊。

您通常在儲存庫上觸發的大多數資料訪問操作都會導致對資料庫執行查詢。定義這樣的查詢就是在儲存庫介面上宣告一個方法,如以下示例所示:

示例 58.帶有查詢方法的 PersonRepository

interface PersonRepository extends PagingAndSortingRepository {

List findByFirstname(String firstname);

List findByFirstnameOrderByLastname(String firstname, Pageable pageable);

Slice findByLastname(String lastname, Pageable pageable);

Page findByLastname(String lastname, Pageable pageable);

Person findByFirstnameAndLastname(String firstname, String lastname);

Person findFirstByLastname(String lastname);

@Query("SELECT * FROM person WHERE lastname = :lastname")

List findByLastname(String lastname);

}

該方法顯示對所有具有給定 的人的查詢lastname。該查詢是透過解析可以與And和連線的約束的方法名稱來派生的Or。因此,方法名稱導致查詢表示式為SELECT … FROM person WHERE firstname = :firstname。

使用Pageable來抵消和排序引數傳遞到資料庫。

返回一個Slice. 選擇LIMIT+1行以確定是否有更多資料要使用。ResultSetExtractor不支援自定義。

執行分頁查詢,返回Page. 僅選擇給定頁面邊界內的資料,並可能使用計數查詢來確定總計數。ResultSetExtractor不支援自定義。

查詢給定條件的單個實體。它以
IncorrectResultSizeDataAccessException非唯一結果結束。

與 相比,即使查詢產生更多的結果文件,第一個實體也總是被髮出。

該findByLastname方法顯示了對所有具有給定姓氏的人的查詢。

Spring Data JDBC參考文件 三

下表顯示了查詢方法支援的關鍵字:

Spring Data JDBC參考文件 三

Spring Data JDBC參考文件 三

查詢派生僅限於可以在WHERE不使用連線的情況下在子句中使用的屬性。

9.7.1. 查詢查詢策略

JDBC 模組支援將查詢手動定義為@Query註釋中的字串或屬性檔案中的命名查詢。

從方法名稱派生查詢目前僅限於簡單屬性,這意味著屬性直接存在於聚合根中。此外,此方法僅支援選擇查詢。

9.7.2. 使用@Query

下面的例子展示瞭如何使用@Query來宣告一個查詢方法:

示例 59. 使用 @Query 宣告查詢方法

public interface UserRepository extends CrudRepository {

@Query("select firstName, lastName from User u where u.emailAddress = :email")

User findByEmailAddress(@Param("email") String email);

}

對於將查詢結果轉換為實體RowMapper,預設情況下使用與 Spring Data JDBC 生成的查詢相同的實體。您提供的查詢必須與RowMapper預期的格式相匹配。必須提供實體建構函式中使用的所有屬性的列。透過 setter、wither 或 field 訪問設定的屬性列是可選的。結果中沒有匹配列的屬性將不會被設定。該查詢用於填充聚合根、嵌入實體和一對一關係,包括作為 SQL 陣列型別儲存和載入的原始型別陣列。為實體的對映、列表、集合和陣列生成單獨的查詢。

Spring 完全支援 Java 8 的基於-parameters編譯器標誌的引數名稱發現。透過在構建中使用此標誌作為除錯資訊的替代方法,您可以省略@Param命名引數的註釋。

Spring Data JDBC 僅支援命名引數。

9.7.3. 命名查詢

如果如上一節所述,註解中沒有給出查詢,Spring Data JDBC 將嘗試定位一個命名查詢。有兩種方法可以確定查詢的名稱。預設是採用查詢的域類,即儲存庫的聚合根,採用其簡單名稱並附加以..分隔的方法名稱。或者,@Query註釋具有一個name屬性,可用於指定要查詢的查詢的名稱。

命名查詢應在
META-INF/jdbc-named-queries.properties類路徑上的屬性檔案中提供。

可以透過將值設定為 來更改該檔案的位置@
EnableJdbcRepositories.namedQueriesLocation。

風俗 RowMapper

您可以RowMapper透過使用@Query(rowMapperClass = ….)或 透過註冊RowMapperMapbean 並註冊RowMapper每個方法的返回型別來配置要使用的物件。以下示例顯示瞭如何註冊
DefaultQueryMappingConfiguration:

@Bean

QueryMappingConfiguration rowMappers() {

return new DefaultQueryMappingConfiguration()

.register(Person.class, new PersonRowMapper())

.register(Address.class, new AddressRowMapper());

}

在確定將哪個RowMapper用於方法時,根據方法的返回型別遵循以下步驟:

如果型別是簡單型別,RowMapper則使用no 。

相反,查詢應返回單行單列,並對該值應用到返回型別的轉換。

QueryMappingConfiguration迭代中的實體類,直到找到一個是相關返回型別的超類或介面。使用RowMapper為該類註冊的。

迭代按照註冊的順序進行,因此請確保在特定型別之後註冊更通用的型別。

如果適用,包裝器型別(例如集合)或被Optional解包。因此,返回型別 ofOptional使用Person前面過程中的型別。

使用自定義RowMapperthrough QueryMappingConfiguration、@Query(rowMapperClass=…)或自定義ResultSetExtractor會禁用實體回撥和生命週期事件,因為結果對映可以根據需要發出自己的事件/回撥。

修改查詢

您可以使用@Modifyingon query 方法將查詢標記為修改查詢,如以下示例所示:

@Modifying

@Query("UPDATE DUMMYENTITY SET name = :name WHERE id = :id")

boolean updateName(@Param("id") Long id, @Param("name") String name);

您可以指定以下返回型別:

void

int (更新記錄數)

boolean(是否更新了記錄)

9.8. MyBatis 整合

CRUD 操作和查詢方法可以委託給 MyBatis。本節介紹如何配置 Spring Data JDBC 以與 MyBatis 整合,以及將查詢的執行以及到庫的對映移交給它的約定。

9.8.1. 配置

將 MyBatis 正確插入 Spring Data JDBC 的最簡單方法是匯入MyBatisJdbcConfiguration應用程式配置:

@Configuration

@EnableJdbcRepositories

@Import(MyBatisJdbcConfiguration.class)

class Application {

@Bean

SqlSessionFactoryBean sqlSessionFactoryBean() {

// Configure MyBatis here

}

}

如您所見,您只需要宣告一個
SqlSessionFactoryBeanasMyBatisJdbcConfiguration依賴於最終SqlSession可用的bean ApplicationContext。

9.8.2. 使用約定

對於 中的每個操作CrudRepository,Spring Data JDBC 執行多個語句。如果SqlSessionFactory應用程式上下文中有 ,Spring Data 會檢查每一步是否SessionFactory提供了一條語句。如果找到,則使用該語句(包括其配置到實體的對映)。

宣告的名稱與串接實體型別的完全限定名稱構造Mapper.和String確定的一種說法。例如,如果org.example.User要插入的例項,Spring Data JDBC 會查詢名為 的語句
org.example.UserMapper.insert。

當語句執行時, [ MyBatisContext]的例項作為引數傳遞,這使得語句可以使用各種引數。

下表描述了可用的 MyBatis 語句:

Spring Data JDBC參考文件 三

Spring Data JDBC參考文件 三

Spring Data JDBC參考文件 三

內容提示:本文(Spring Data JDBC參考文件)未完待續......


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69981720/viewspace-2795376/,如需轉載,請註明出處,否則將追究法律責任。

相關文章