国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - spring Data jpa簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

spring Data jpa簡介_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

2020-12-29 14:31hungerW Java教程

這篇文章主要介紹了spring Data jpa簡介的相關(guān)資料,需要的朋友可以參考下

前言

自 JPA 伴隨 Java EE 5 發(fā)布以來,受到了各大廠商及開源社區(qū)的追捧,各種商用的和開源的 JPA 框架如雨后春筍般出現(xiàn),為開發(fā)者提供了豐富的選擇。它一改之前 EJB 2.x 中實(shí)體 Bean 笨重且難以使用的形象,充分吸收了在開源社區(qū)已經(jīng)相對(duì)成熟的 ORM 思想。另外,它并不依賴于 EJB 容器,可以作為一個(gè)獨(dú)立的持久層技術(shù)而存在。目前比較成熟的 JPA 框架主要包括 Jboss 的 Hibernate EntityManager、Oracle 捐獻(xiàn)給 Eclipse 社區(qū)的 EclipseLink、Apache 的 OpenJPA 等。

Java持久化規(guī)范,是從EJB2.x以前的實(shí)體Bean(Entity bean)分離出來的,EJB3以后不再有實(shí)體bean,而是將實(shí)體bean放到JPA中實(shí)現(xiàn)。JPA是sun提出的一個(gè)對(duì)象持久化規(guī)范,各JavaEE應(yīng)用服務(wù)器自主選擇具體實(shí)現(xiàn),JPA的設(shè)計(jì)者是Hibernate框架的作者,因此Hibernate作為Jboss服務(wù)器中JPA的默認(rèn)實(shí)現(xiàn),Oracle的Weblogic使用EclipseLink(以前叫TopLink)作為默認(rèn)的JPA實(shí)現(xiàn),IBM的Websphere和Sun的Glassfish默認(rèn)使用OpenJPA(Apache的一個(gè)開源項(xiàng)目)作為其默認(rèn)的JPA實(shí)現(xiàn)。

JPA的底層實(shí)現(xiàn)是一些流行的開源ORM(對(duì)象關(guān)系映射)框架,因此JPA其實(shí)也就是java實(shí)體對(duì)象和關(guān)系型數(shù)據(jù)庫建立起映射關(guān)系,通過面向?qū)ο缶幊痰乃枷氩僮麝P(guān)系型數(shù)據(jù)庫的規(guī)范。

Spring 框架對(duì) JPA 的支持

Spring 框架對(duì) JPA 提供的支持主要體現(xiàn)在如下幾個(gè)方面:

  • 首先,它使得 JPA 配置變得更加靈活。JPA 規(guī)范要求,配置文件必須命名為 persistence.xml,并存在于類路徑下的 META-INF 目錄中。該文件通常包含了初始化 JPA 引擎所需的全部信息。Spring 提供的 LocalContainerEntityManagerFactoryBean 提供了非常靈活的配置,persistence.xml 中的信息都可以在此以屬性注入的方式提供。
  • 其次,Spring 實(shí)現(xiàn)了部分在 EJB 容器環(huán)境下才具有的功能,比如對(duì) @PersistenceContext、@PersistenceUnit 的容器注入支持。
  • 第三,也是最具意義的,Spring 將 EntityManager 的創(chuàng)建與銷毀、事務(wù)管理等代碼抽取出來,并由其統(tǒng)一管理,開發(fā)者不需要關(guān)心這些,業(yè)務(wù)方法中只剩下操作領(lǐng)域?qū)ο蟮拇a,事務(wù)管理和 EntityManager 創(chuàng)建、銷毀的代碼都不再需要開發(fā)者關(guān)心了。

Spring Data JPA 更簡潔

Spring Data JPA 框架,主要針對(duì)的就是 Spring 唯一沒有簡化到的業(yè)務(wù)邏輯代碼,至此,開發(fā)者連僅剩的實(shí)現(xiàn)持久層業(yè)務(wù)邏輯的工作都省了,唯一要做的,就只是聲明持久層的接口,其他都交給 Spring Data JPA 來幫你完成!

下面就來了解Spring Data JPA。

1.下載需要的包。

需要先 下載Spring Data JPA 的發(fā)布包(需要同時(shí)下載 Spring Data Commons 和 Spring Data JPA 兩個(gè)發(fā)布包,Commons 是 Spring Data 的公共基礎(chǔ)包),并把相關(guān)的依賴 JAR 文件加入到 CLASSPATH 中。

2.讓持久層接口 Dao(以UserDao)  繼承 Repository 接口。

該接口使用了泛型,需要為其提供兩個(gè)類型:第一個(gè)為該接口處理的域?qū)ο箢愋停诙€(gè)為該域?qū)ο蟮闹麈I類型。 如下:

Spring Data JPA 風(fēng)格的持久層接口:

?
1
2
3
public interface UserDao extends Repository<AccountInfo, Long> {
  public AccountInfo save(AccountInfo accountInfo);
 }

不需要UserDao的實(shí)現(xiàn)類,框架會(huì)為我們完成業(yè)務(wù)邏輯。

3.在 Spring 配置文件中啟用掃描并自動(dòng)創(chuàng)建代理的功能。

?
1
2
3
4
<-- 需要在 <beans> 標(biāo)簽中增加對(duì) jpa 命名空間的引用 -->
<jpa:repositories base-package="footmark.springdata.jpa.dao"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager"/>

4.測試代碼。

?
1
2
3
4
5
6
7
public interface UserDao extends Repository<AccountInfo, Long> {
 
public AccountInfo save(AccountInfo accountInfo);
 
// 你需要做的,僅僅是新增如下一行方法聲明
public AccountInfo findByAccountId(Long accountId);
}

5.總結(jié)

使用 Spring Data JPA 進(jìn)行持久層開發(fā)大致需要的三個(gè)步驟:

1.聲明持久層的接口,該接口繼承 Repository,Repository 是一個(gè)標(biāo)記型接口,它不包含任何方法,當(dāng)然如果有需要,Spring Data 也提供了若干 Repository 子接口,其中定義了一些常用的增刪改查,以及分頁相關(guān)的方法。

2.在接口中聲明需要的業(yè)務(wù)方法。Spring Data 將根據(jù)給定的策略來為其生成實(shí)現(xiàn)代碼。

3.在 Spring 配置文件中增加一行聲明,讓 Spring 為聲明的接口創(chuàng)建代理對(duì)象。配置了 <jpa:repositories> 后,Spring 初始化容器時(shí)將會(huì)掃描 base-package 指定的包目錄及其子目錄,為繼承 Repository 或其子接口的接口創(chuàng)建代理對(duì)象,并將代理對(duì)象注冊為 Spring Bean,業(yè)務(wù)層便可以通過 Spring 自動(dòng)封裝的特性來直接使用該對(duì)象。

此外,<jpa:repository> 還提供了一些屬性和子標(biāo)簽,便于做更細(xì)粒度的控制??梢栽?<jpa:repository> 內(nèi)部使用 <context:include-filter>、<context:exclude-filter> 來過濾掉一些不希望被掃描到的接口。

接口繼承

持久層接口繼承 Repository 并不是唯一選擇。Repository 接口是 Spring Data 的一個(gè)核心接口,它不提供任何方法,開發(fā)者需要在自己定義的接口中聲明需要的方法。與繼承 Repository 等價(jià)的一種方式,就是在持久層接口上使用 @RepositoryDefinition 注解,并為其指定 domainClass 和 idClass 屬性。如下兩種方式是完全等價(jià)的:

兩種等價(jià)的繼承接口方式示例:

?
1
2
3
4
public interface UserDao extends Repository<AccountInfo, Long> { …… }
 
 @RepositoryDefinition(domainClass = AccountInfo.class, idClass = Long.class)
 public interface UserDao { …… }

1.如果持久層接口較多,且每一個(gè)接口都需要聲明相似的增刪改查方法,直接繼承 Repository 就顯得有些啰嗦,這時(shí)可以繼承 CrudRepository,它會(huì)自動(dòng)為域?qū)ο髣?chuàng)建增刪改查方法,供業(yè)務(wù)層直接使用。開發(fā)者只是多寫了 "Crud" 四個(gè)字母,即刻便為域?qū)ο筇峁┝碎_箱即用的十個(gè)增刪改查方法。

2.使用 CrudRepository 也有副作用,它可能暴露了你不希望暴露給業(yè)務(wù)層的方法。比如某些接口你只希望提供增加的操作而不希望提供刪除的方法。針對(duì)這種情況,開發(fā)者只能退回到 Repository 接口,然后到 CrudRepository 中把希望保留的方法聲明復(fù)制到自定義的接口中即可.

3.分頁查詢和排序是持久層常用的功能,Spring Data 為此提供了 PagingAndSortingRepository 接口,它繼承自 CrudRepository 接口,在 CrudRepository 基礎(chǔ)上新增了兩個(gè)與分頁有關(guān)的方法。但是,我們很少會(huì)將自定義的持久層接口直接繼承自 PagingAndSortingRepository,而是在繼承 Repository 或 CrudRepository 的基礎(chǔ)上,在自己聲明的方法參數(shù)列表最后增加一個(gè) Pageable 或 Sort 類型的參數(shù),用于指定分頁或排序信息即可,這比直接使用 PagingAndSortingRepository 提供了更大的靈活性。

4.JpaRepository 是繼承自 PagingAndSortingRepository 的針對(duì) JPA 技術(shù)提供的接口,它在父接口的基礎(chǔ)上,提供了其他一些方法,比如 flush(),saveAndFlush(),deleteInBatch() 等。如果有這樣的需求,則可以繼承該接口。

查詢方式

1.通過解析方法名創(chuàng)建查詢

框架在進(jìn)行方法名解析時(shí),會(huì)先把方法名多余的前綴截取掉,比如 find、findBy、read、readBy、get、getBy,然后對(duì)剩下部分進(jìn)行解析。并且如果方法的最后一個(gè)參數(shù)是 Sort 或者 Pageable 類型,也會(huì)提取相關(guān)的信息,以便按規(guī)則進(jìn)行排序或者分頁查詢。

  1. 在創(chuàng)建查詢時(shí),我們通過在方法名中使用屬性名稱來表達(dá),比如 findByUserAddressZip ()??蚣茉诮馕鲈摲椒〞r(shí),首先剔除 findBy,然后對(duì)剩下的屬性進(jìn)行解析,詳細(xì)規(guī)則如下(此處假設(shè)該方法針對(duì)的域?qū)ο鬄?AccountInfo 類型):
  2. 先判斷 userAddressZip (根據(jù) POJO 規(guī)范,首字母變?yōu)樾?,下同)是否?AccountInfo 的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒有該屬性,繼續(xù)第二步;
  3. 從右往左截取第一個(gè)大寫字母開頭的字符串(此處為 Zip),然后檢查剩下的字符串是否為 AccountInfo 的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒有該屬性,則重復(fù)第二步,繼續(xù)從右往左截??;最后假設(shè) user 為 AccountInfo 的一個(gè)屬性;
  4. 接著處理剩下部分( AddressZip ),先判斷 user 所對(duì)應(yīng)的類型是否有 addressZip 屬性,如果有,則表示該方法最終是根據(jù) "AccountInfo.user.addressZip" 的取值進(jìn)行查詢;否則繼續(xù)按照步驟 2 的規(guī)則從右往左截取,最終表示根據(jù) "AccountInfo.user.address.zip" 的值進(jìn)行查詢。

在查詢時(shí),通常需要同時(shí)根據(jù)多個(gè)屬性進(jìn)行查詢,且查詢的條件也格式各樣(大于某個(gè)值、在某個(gè)范圍等等),Spring Data JPA 為此提供了一些表達(dá)條件查詢的關(guān)鍵字,大致如下:

  • And --- 等價(jià)于 SQL 中的 and 關(guān)鍵字,比如 findByUsernameAndPassword(String user, Striang pwd);
  • Or --- 等價(jià)于 SQL 中的 or 關(guān)鍵字,比如 findByUsernameOrAddress(String user, String addr);
  • Between --- 等價(jià)于 SQL 中的 between 關(guān)鍵字,比如 findBySalaryBetween(int max, int min);
  • LessThan --- 等價(jià)于 SQL 中的 "<",比如 findBySalaryLessThan(int max);
  • GreaterThan --- 等價(jià)于 SQL 中的">",比如 findBySalaryGreaterThan(int min);
  • IsNull --- 等價(jià)于 SQL 中的 "is null",比如 findByUsernameIsNull();
  • IsNotNull --- 等價(jià)于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();
  • NotNull --- 與 IsNotNull 等價(jià);
  • Like --- 等價(jià)于 SQL 中的 "like",比如 findByUsernameLike(String user);
  • NotLike --- 等價(jià)于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);
  • OrderBy --- 等價(jià)于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);
  • Not --- 等價(jià)于 SQL 中的 "! =",比如 findByUsernameNot(String user);
  • In --- 等價(jià)于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的參數(shù)可以是 Collection 類型,也可以是數(shù)組或者不定長參數(shù);
  • NotIn --- 等價(jià)于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的參數(shù)可以是 Collection 類型,也可以是數(shù)組或者不定長參數(shù);

2.使用 @Query 創(chuàng)建查詢

@Query 注解的使用非常簡單,只需在聲明的方法上面標(biāo)注該注解,同時(shí)提供一個(gè) JP QL 查詢語句即可,如下所示:

?
1
2
3
4
5
6
7
8
9
public interface UserDao extends Repository<AccountInfo, Long> {
 
@Query("select a from AccountInfo a where a.accountId = ?1")
public AccountInfo findByAccountId(Long accountId);
 
 @Query("select a from AccountInfo a where a.balance > ?1")
public Page<AccountInfo> findByBalanceGreaterThan(
Integer balance,Pageable pageable);
}

很多開發(fā)者在創(chuàng)建 JP QL 時(shí)喜歡使用命名參數(shù)來代替位置編號(hào),@Query 也對(duì)此提供了支持。JP QL 語句中通過": 變量"的格式來指定參數(shù),同時(shí)在方法的參數(shù)前面使用 @Param 將方法參數(shù)與 JP QL 中的命名參數(shù)對(duì)應(yīng),示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
public interface UserDao extends Repository<AccountInfo, Long> {
 
 public AccountInfo save(AccountInfo accountInfo);
 
 @Query("from AccountInfo a where a.accountId = :id")
 public AccountInfo findByAccountId(@Param("id")Long accountId);
 
  @Query("from AccountInfo a where a.balance > :balance")
  public Page<AccountInfo> findByBalanceGreaterThan(
 @Param("balance")Integer balance,Pageable pageable);
 }

此外,開發(fā)者也可以通過使用 @Query 來執(zhí)行一個(gè)更新操作,為此,我們需要在使用 @Query 的同時(shí),用 @Modifying 來將該操作標(biāo)識(shí)為修改查詢,這樣框架最終會(huì)生成一個(gè)更新的操作,而非查詢。如下所示:

?
1
2
3
@Modifying
@Query("update AccountInfo a set a.salary = ?1 where a.salary < ?2")
public int increaseSalary(int after, int before);

3.通過調(diào)用 JPA 命名查詢語句創(chuàng)建查詢

命名查詢是 JPA 提供的一種將查詢語句從方法體中獨(dú)立出來,以供多個(gè)方法共用的功能。Spring Data JPA 對(duì)命名查詢也提供了很好的支持。用戶只需要按照 JPA 規(guī)范在 orm.xml 文件或者在代碼中使用 @NamedQuery(或 @NamedNativeQuery)定義好查詢語句,唯一要做的就是為該語句命名時(shí),需要滿足”DomainClass.methodName()”的命名規(guī)則。假設(shè)定義了如下接口:

?
1
2
3
4
public interface UserDao extends Repository<AccountInfo, Long> {
 ......
 public List<AccountInfo> findTop5();
 }

如果希望為 findTop5() 創(chuàng)建命名查詢,并與之關(guān)聯(lián),我們只需要在適當(dāng)?shù)奈恢枚x命名查詢語句,并將其命名為 "AccountInfo.findTop5",框架在創(chuàng)建代理類的過程中,解析到該方法時(shí),優(yōu)先查找名為 "AccountInfo.findTop5" 的命名查詢定義,如果沒有找到,則嘗試解析方法名,根據(jù)方法名字創(chuàng)建查詢。

Spring Data JPA 對(duì)事務(wù)的支持

默認(rèn)情況下,Spring Data JPA 實(shí)現(xiàn)的方法都是使用事務(wù)的。針對(duì)查詢類型的方法,其等價(jià)于 @Transactional(readOnly=true);增刪改類型的方法,等價(jià)于 @Transactional??梢钥闯?,除了將查詢的方法設(shè)為只讀事務(wù)外,其他事務(wù)屬性均采用默認(rèn)值。

如果用戶覺得有必要,可以在接口方法上使用 @Transactional 顯式指定事務(wù)屬性,該值覆蓋 Spring Data JPA 提供的默認(rèn)值。同時(shí),開發(fā)者也可以在業(yè)務(wù)層方法上使用 @Transactional 指定事務(wù)屬性,這主要針對(duì)一個(gè)業(yè)務(wù)層方法多次調(diào)用持久層方法的情況。持久層的事務(wù)會(huì)根據(jù)設(shè)置的事務(wù)傳播行為來決定是掛起業(yè)務(wù)層事務(wù)還是加入業(yè)務(wù)層的事務(wù)。具體 @Transactional 的使用可以參考Spring的參考文檔。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 午夜黄色影院 | 7799精品视频天天看 | 欧美色视频在线观看 | 日韩成人精品 | 久久久久久av| 国产免费自拍 | 美女毛片 | 91av精品视频| 天堂资源最新在线 | 中文字幕视频在线观看 | 午夜伦理影院 | 天天澡天天狠天天天做 | 久久精品一区二区三区四区 | 亚洲一区视频 | 国产黄色网址在线观看 | 一级毛片视频 | 先锋av在线资源 | 久久久久久网址 | 久久久精品在线观看 | 成人午夜精品久久久久久久网站 | 国产精品18久久久久vr手机版特色 | 日韩成人在线视频 | 伊人在线| 亚洲国产精品欧美一二99 | 美女视频一区二区三区 | 亚洲国产一区二区三区四区 | 中文视频在线 | 亚洲高清www | 免费午夜在线视频 | 国产中文一区 | 成人在线免费观看视频 | 成人免费黄色大片 | 一级色网站 | 开心久久婷婷综合中文字幕 | 久久99国产精品免费网站 | 久草免费福利 | 国产精品久久久久久久久久东京 | 中文字幕日产乱码六区小草 | 不卡一区 | 亚洲av毛片| 免费簧片 |