elasticsearch入門系列">elasticsearch入門系列
825
2025-03-31
spring Data框架和spring Data JPA簡介
Spring Data : Spring 的一個(gè)子項(xiàng)目。用于簡化數(shù)據(jù)庫訪問,支持NoSQL 和 關(guān)系數(shù)據(jù)存儲(chǔ)。
下面給出SpringData 項(xiàng)目所支持 NoSQL 存儲(chǔ):
MongoDB (文檔數(shù)據(jù)庫)
Neo4j(圖形數(shù)據(jù)庫)
Redis(鍵/值存儲(chǔ))
Hbase(列族數(shù)據(jù)庫)
SpringData 項(xiàng)目所支持的關(guān)系數(shù)據(jù)存儲(chǔ)技術(shù):
JDBC
JPA
JPA Spring Data : 致力于減少數(shù)據(jù)訪問層 (DAO) 的開發(fā)量。開發(fā)者只要寫好持久層接口就好,然后其它的框架會(huì)幫程序員實(shí)現(xiàn)。
Spring Data JPA例子
實(shí)現(xiàn)步驟:
1.配置 Spring 整合 JPA
2.在 Spring 配置文件中配置 Spring Data,讓 Spring 為聲明的接口創(chuàng)建代理對(duì)象。
3.聲明持久層的接口,該接口繼承 Repository
4.在接口中聲明需要的方法
同時(shí)下載 Spring Data Commons 和 Spring Data JPA 兩個(gè)發(fā)布包,也可以在maven里配置
1
2
3
4
5
寫個(gè)接口Repository:
public interface UserRepository extends Repository
1
2
3
Repository接口概述:
(1)Repository 接口是 Spring Data 的一個(gè)核心接口,它不提供任何方法,開發(fā)者需要在自己定義的接口中聲明需要的方法
public interface Repository
(2)Spring Data可以讓我們只定義接口,只要遵循 Spring Data的規(guī)范,就無需寫實(shí)現(xiàn)類。
(3)與繼承 Repository 等價(jià)的一種方式,就是在持久層接口上使用 @RepositoryDefinition 注解,并為其指定 domainClass 和 idClass 屬性。如下兩種方式是完全等價(jià)的
Repository子接口
基礎(chǔ)的Repository提供了最基本的數(shù)據(jù)訪問功能,其幾個(gè)子接口則擴(kuò)展了一些功能。
按照 Spring Data 的規(guī)范,查詢方法以 find | read | get 開頭, 涉及條件查詢時(shí),條件的屬性用條件關(guān)鍵字連接,要注意的是:條件屬性以首字母大寫。
查詢方法解析
假如創(chuàng)建如下的查詢:findByUserDepUuid(),框架在解析該方法時(shí),首先剔除 findBy,然后對(duì)剩下的屬性進(jìn)行解析,假設(shè)查詢實(shí)體為Doc
(1)先判斷 userDepUuid (根據(jù) POJO 規(guī)范,首字母變?yōu)樾懀┦欠駷椴樵儗?shí)體的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒有該屬性,繼續(xù)第二步;
(2)從右往左截取第一個(gè)大寫字母開頭的字符串(此處為Uuid),然后檢查剩下的字符串是否為查詢實(shí)體的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒有該屬性,則重復(fù)第二步,繼續(xù)從右往左截取;最后假設(shè) user 為查詢實(shí)體的一個(gè)屬性;
(3)接著處理剩下部分(DepUuid),先判斷 user 所對(duì)應(yīng)的類型是否有depUuid屬性,如果有,則表示該方法最終是根據(jù) “ Doc.user.depUuid” 的取值進(jìn)行查詢;否則繼續(xù)按照步驟 2 的規(guī)則從右往左截取,最終表示根據(jù) “Doc.user.dep.uuid” 的值進(jìn)行查詢。
(4)可能會(huì)存在一種特殊情況,比如 Doc包含一個(gè) user 的屬性,也有一個(gè) userDep 屬性,此時(shí)會(huì)存在混淆。可以明確在屬性之間加上 “_” 以顯式表達(dá)意圖,比如 “findByUser_DepUuid()” 或者 “findByUserDep_uuid()”
特殊的參數(shù): 還可以直接在方法的參數(shù)上加入分頁或排序的參數(shù),比如:
Page findByName(String name, Pageable pageable);
List findByName(String name, Sort sort);
使用 @Query 注解
@Query來指定本地查詢
注意要點(diǎn)
如果是 @Query 中有 LIKE 關(guān)鍵字,后面的參數(shù)需要前面或者后面加 %,這樣在傳遞參數(shù)值的時(shí)候就可以不加 %:
@Query("select o from UserModel o where o.name like %?1")
1
2
使用@Query來指定本地查詢,只要設(shè)置nativeQuery為true
@Query(value="select * from tbl_user where name like %?1" ,nativeQuery=true)
1
@Query 與 @Modifying 這兩個(gè) annotation一起聲明,可定義個(gè)性化更新操作,例如只涉及某些字段更新時(shí)最為常用
Spring Data 提供了默認(rèn)的事務(wù)處理方式,即所有的查詢均聲明為只讀事務(wù)。
CrudRepository 接口
CrudRepository 接口提供了最基本的對(duì)實(shí)體類的添刪改查操作
PagingAndSortingRepository接口
該接口提供了分頁與排序功能
Iterable findAll(Sort sort); //排序
Page findAll(Pageable pageable); //分頁查詢(含排序功能)
JpaRepository接口
該接口提供了JPA的相關(guān)功能
List findAll(); //查找所有實(shí)體
List findAll(Sort sort); //排序、查找所有實(shí)體
List save(Iterable extends T> entities);//保存集合
void flush();//執(zhí)行緩存與數(shù)據(jù)庫同步
T saveAndFlush(T entity);//強(qiáng)制執(zhí)行持久化
void deleteInBatch(Iterable entities);//刪除一個(gè)實(shí)體集合
JpaSpecificationExecutor接口
不屬于Repository體系,實(shí)現(xiàn)一組 JPA Criteria 查詢相關(guān)的方法
注意也可以自定義Repository的方法
Spring 數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。