天天看點

Spring Data JDBC參考文檔 三

原标題:Spring認證|Spring Data JDBC參考文檔三 (内容來源:Spring中國教育管理中心)

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方法顯示了對所有具有給定姓氏的人的查詢。

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

查詢派生僅限于可以在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 {

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參考文檔)未完待續......