欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?Data?JPA框架快速入門之自定義Repository接口

 更新時(shí)間:2022年04月27日 16:18:24   作者:嫣夜來(lái)  
Spring?Data?JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套?JPA?應(yīng)?框架,可使開發(fā)者?極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和操作,本篇我們來(lái)了解Spring?Data?JPA框架的自定義Repository接口

自定義Repository接口

要定義一個(gè)repository接口,你首先需要自定義一個(gè)實(shí)體類專用的Repository接口。該接口必須擴(kuò)展 Repository,并將其類型指定為實(shí)體類和實(shí)體類的 ID 類型。

如果你想為該實(shí)體類資源類型開放CRUD方法,請(qǐng)直接繼承CrudRepository而不是Repository。

repository接口定義

通常,你的repository接口會(huì)擴(kuò)展Repository、CrudRepository或PagingAndSortingRepository。

如果你不想擴(kuò)展Spring Data接口,你也可以用@RepositoryDefinition來(lái)注解你的repository接口。

繼承CrudRepository接口會(huì)公開一套完整的CRUD方法來(lái)操作你的實(shí)體類對(duì)象, 如果你希望自行決定暴露哪些方法,可以從CrudRepository中復(fù)制你想暴露的方法到你的自定義的repository接口中即可。

通過(guò)以上的操作可以讓你在所提供的Spring Data Repositories功能的基礎(chǔ)上定義自己的repository接口抽象。

下面通過(guò)實(shí)例展示了如何有選擇地對(duì)外開放某些指定的CRUD方法(本例中對(duì)外開放findById和save接口方法)。

選擇性對(duì)外暴露指定CRUD方法讓其他人使用

@NoRepositoryBean
interface MyBaseRepository<T, ID> extends Repository<T, ID> {
  Optional<T> findById(ID id);
  <S extends T> S save(S entity);
}
interface UserRepository extends MyBaseRepository<User, Long> {
  User findByEmailAddress(EmailAddress emailAddress);
}

在前面的例子中,我們?yōu)樗械膔epository定義了一個(gè)通用的基礎(chǔ)接口,并暴露了findById(…)以及save(…)方法。

這些方法被路由到Spring Data提供的你所選擇的store的基礎(chǔ)repository實(shí)現(xiàn)(例如,如果你使用JPA,實(shí)現(xiàn)就是SimpleJpaRepository),因?yàn)樗鼈兣cCrudRepository中的方法簽名一致。所以UserRepository現(xiàn)在可以保存用戶,通過(guò)ID找到單個(gè)用戶,并觸發(fā)查詢,通過(guò)電子郵件地址找到用戶對(duì)象。

自定義的中間repository接口上需要添加@NoRepositoryBean。但是請(qǐng)?zhí)貏e注意,在所有Spring Data需要在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建實(shí)例的repository接口上一定不要添加該注解。

就比如上面的示例代碼,

- MyBaseRepository就是中間repository接口, 我們需要使用他來(lái)自定義對(duì)外開放哪些CRUD方法,需要添加@NoRepositoryBean注解, 這個(gè)注解的意思就是一個(gè)標(biāo)記,為了通知JPA不要?jiǎng)?chuàng)建該接口的bean對(duì)象

這個(gè)@NoRepositoryBean就是用在中間repository接口上的, 但是從中間接口派生出具體的repository接口, 對(duì)應(yīng)上面的示例代碼就是UserRepository接口, 在這個(gè)接口上一定不要添加@NoRepositoryBean注解,如果添加了, 這個(gè)UserRepository接口的bean對(duì)象就不會(huì)注入到容器中了

使用Repository接口

在多個(gè)Spring Data模塊中使用Repository接口

在你的應(yīng)用程序中使用一個(gè)唯一的的Spring Data模塊使事情變得簡(jiǎn)單,因?yàn)槎x范圍內(nèi)的所有存儲(chǔ)庫(kù)接口都綁定到Spring Data模塊。有時(shí),應(yīng)用程序需要使用一個(gè)以上的Spring Data模塊。在這種情況下,存儲(chǔ)庫(kù)定義必須區(qū)分持久化技術(shù)。當(dāng)它檢測(cè)到類classpath路徑下有多個(gè)repository factory時(shí),Spring Data會(huì)進(jìn)入嚴(yán)格的respository配置模式。嚴(yán)格的配置使用respository或域類的細(xì)節(jié)來(lái)決定respository定義的Spring Data模塊綁定。

如果資源庫(kù)定義擴(kuò)展了特定模塊的資源庫(kù),那么它就是特定Spring Data模塊的有效候選者。

如果域類被注解了特定模塊的類型注解,它就是特定Spring Data模塊的有效候選者。Spring Data模塊接受第三方注解(如JPA的@Entity)或提供自己的注解(如Spring Data MongoDB和Spring Data Elasticsearch的@Document)。

下面的例子顯示了一個(gè)使用特定模塊接口的存儲(chǔ)庫(kù)(本例中為 JPA)。

  • 例1. 使用module-specific接口的repository定義
interface MyRepository extends JpaRepository<User, Long> { }
@NoRepositoryBean
interface MyBaseRepository<T, ID> extends JpaRepository<T, ID> { … }
interface UserRepository extends MyBaseRepository<User, Long> { … }

MyRepository和UserRepository在其類型層次上擴(kuò)展了JpaRepository。它們是Spring Data JPA模塊的有效候選者。

下面的例子顯示了一個(gè)使用通用接口的repository接口。

  • 例2. 使用通用接口的repository定義
interface AmbiguousRepository extends Repository<User, Long> { … }
@NoRepositoryBean
interface MyBaseRepository<T, ID> extends CrudRepository<T, ID> { … }
interface AmbiguousUserRepository extends MyBaseRepository<User, Long> { … }

AmbiguousRepository和AmbiguousUserRepository在其類型層次結(jié)構(gòu)中只擴(kuò)展了Repository和CrudRepository。雖然在使用唯一的Spring Data模塊時(shí),這很好,但多個(gè)模塊無(wú)法區(qū)分這些repository接口應(yīng)該被綁定到哪個(gè)特定的Spring Data。

下面的例子顯示了一個(gè)使用帶注解的領(lǐng)域類的repository接口。

  • 例3. 使用帶注解的domain類的repository定義
interface PersonRepository extends Repository<Person, Long> { … }
@Entity
class Person { … }
interface UserRepository extends Repository<User, Long> { … }
@Document
class User { … }

PersonRepository引用了Person,它被JPA的@Entity注解所注解,所以這個(gè)repository接口顯然屬于Spring Data JPA。UserRepository引用了User,它被Spring Data MongoDB的@Document注釋所注解。

下面的壞例子顯示了一個(gè)使用混合注解的domain類的repository接口。

  • 例4. 使用混合注解的領(lǐng)域類的repository定義
interface JpaPersonRepository extends Repository<Person, Long> { … }
interface MongoDBPersonRepository extends Repository<Person, Long> { … }
@Entity
@Document
class Person { … }

這個(gè)例子展示了一個(gè)同時(shí)使用JPA和Spring Data MongoDB注解的領(lǐng)域類。它定義了兩個(gè)repository接口:JpaPersonRepository和MongoDBPersonRepository。一個(gè)用于JPA,另一個(gè)用于MongoDB的使用。Spring Data不再能夠區(qū)分這些repository接口庫(kù),這導(dǎo)致了未定義的行為。

repository接口類型細(xì)節(jié)和區(qū)分domian類注釋用于嚴(yán)格的repository接口配置,以確定特定Spring Data模塊的repository接口候選者。在同一domain類型上使用多個(gè)持久化技術(shù)的特定注解是可能的,并且能夠在多個(gè)持久化技術(shù)中重復(fù)使用domian類型。然而,Spring Data就不能再確定一個(gè)唯一的模塊來(lái)綁定repository接口了。

區(qū)分repository的最后一個(gè)方法是通過(guò)對(duì)repository接口基礎(chǔ)包的掃描?;A(chǔ)包定義了掃描repository接口定義的起點(diǎn),這意味著將repository接口的定義放在適當(dāng)?shù)陌?。默認(rèn)情況下,注解驅(qū)動(dòng)的配置使用配置類的包?;赬ML的配置中的基礎(chǔ)包是強(qiáng)制性的。

下面的例子顯示了注釋驅(qū)動(dòng)的基本包的配置。

  • 例5. 注釋驅(qū)動(dòng)的基礎(chǔ)包配置
@EnableJpaRepositories(basePackages = "com.acme.repositories.jpa")
@EnableMongoRepositories(basePackages = "com.acme.repositories.mongo")
public class Configuration { 
}

到此這篇關(guān)于Spring Data JPA框架快速入門之自定義Repository接口的文章就介紹到這了,更多相關(guān)Spring Data JPA Repository接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java面向?qū)ο蠡A(chǔ)教學(xué)(三)

    Java面向?qū)ο蠡A(chǔ)教學(xué)(三)

    這篇文章主要介紹了Java的面相對(duì)象編程思想,包括類對(duì)象方法和封裝繼承多態(tài)等各個(gè)方面的OOP基本要素,非常推薦,需要的朋友可以參考下,希望可以對(duì)你有所幫助
    2021-07-07
  • SpringBoot根據(jù)各地區(qū)時(shí)間設(shè)置接口有效時(shí)間的實(shí)現(xiàn)方式

    SpringBoot根據(jù)各地區(qū)時(shí)間設(shè)置接口有效時(shí)間的實(shí)現(xiàn)方式

    這篇文章給大家介紹了SpringBoot根據(jù)各地區(qū)時(shí)間設(shè)置接口有效時(shí)間的實(shí)現(xiàn)方式,文中通過(guò)代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • RestTemplate發(fā)送HTTP?POST請(qǐng)求使用方法詳解

    RestTemplate發(fā)送HTTP?POST請(qǐng)求使用方法詳解

    這篇文章主要為大家介紹了RestTemplate發(fā)送HTTP?POST請(qǐng)求的使用方法詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • java發(fā)送email一般步驟(實(shí)例講解)

    java發(fā)送email一般步驟(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇java發(fā)送email一般步驟(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • SpringBoot配置Clickhouse的示例代碼

    SpringBoot配置Clickhouse的示例代碼

    這篇文章主要介紹了SpringBoot配置Clickhouse的示例代碼,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考價(jià)值,需要的朋友可以參考下
    2022-02-02
  • jstl之map,list訪問(wèn)遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)

    jstl之map,list訪問(wèn)遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇jstl之map,list訪問(wèn)遍歷以及el表達(dá)式map取值的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • 基于java讀取并引用自定義配置文件

    基于java讀取并引用自定義配置文件

    這篇文章主要介紹了基于java讀取并引用自定義配置文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • java實(shí)現(xiàn)冒泡排序算法

    java實(shí)現(xiàn)冒泡排序算法

    冒泡排序(Bubble Sort)是一種簡(jiǎn)單的排序算法。它重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過(guò)來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說(shuō)該數(shù)列已經(jīng)排序完成。
    2015-04-04
  • Servlet 過(guò)濾器詳細(xì)介紹

    Servlet 過(guò)濾器詳細(xì)介紹

    這篇文章介紹了Servlet 過(guò)濾器,有需要的朋友可以參考一下
    2013-10-10
  • Java定時(shí)器問(wèn)題實(shí)例解析

    Java定時(shí)器問(wèn)題實(shí)例解析

    這篇文章主要結(jié)合實(shí)例介紹了java當(dāng)中的定時(shí)器的一些問(wèn)題,有需要的朋友可以參考一下
    2017-04-04

最新評(píng)論