最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Data?JPA框架的Repository自定義實現(xiàn)詳解

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

1. Spring Data Repository自定義實現(xiàn)

Spring Data提供了各種選項來創(chuàng)建查詢方法,只需少量編碼。但是當這些選項不能滿足你的需求時,你也可以為資源庫方法提供你自己的自定義實現(xiàn)。本節(jié)主要介紹如何做到這一點。

1.1 自定義特殊repository

要用自定義的功能實現(xiàn)來豐富repository庫,你必須首先定義一個片段接口和自定義功能的實現(xiàn),如下所示。

  • 例1. 自定義接口
public interface CustomUserRepository {
  void customMethod(User user);
}
  • 例2. 自定義接口實現(xiàn)類
public class CustomUserRepositoryImpl implements CustomUserRepository {
  public void customMethod(User user) {
    // Your custom implementation
  }
}

實現(xiàn)類本身并不依賴于Spring Data,它可以是一個普通的Spring Bean對象。因此,你可以使用標準的依賴注入行為來注入對其他Bean(如JdbcTemplate)的引用,參與到切面中進行使用等等。

然后你可以讓你的repository接口擴展片段接口,如下所示。

  • 例3. 修改你的repository接口定義, 讓它擴展你自定義接口
public interface UserRepository extends CrudRepository<User, Long>, CustomUserRepository {
  // Declare query methods here
}

這樣就用你的repository接口擴展自定義接口,結(jié)合了CRUD和自定義功能,并使其對客戶端提供服務(wù)。

Spring Data repositories是通過使用形成repository組合的片段來實現(xiàn)的。片段是基礎(chǔ)repository、功能方面(如QueryDsl),以及自定義接口和它們的實現(xiàn)。每當你為你的repository接口添加一個接口,你就通過添加一個片段來增強組合?;A(chǔ)資源庫和資源庫方面的實現(xiàn)是由每個Spring Data模塊提供的。

下面的例子展示了自定義接口和它們的實現(xiàn)。

  • 例4. 片段與它們的實現(xiàn)
public interface HumanRepository {
  void humanMethod(User user);
}
public class HumanRepositoryImpl implements HumanRepository {
  public void humanMethod(User user) {
    // Your custom implementation
  }
}
public interface ContactRepository {
  void contactMethod1(User user);
  User contactMethod2(User user);
}
public class ContactRepositoryImpl implements ContactRepository {
  public void contactMethod1(User user) {
    // Your custom implementation
  }
  public User contactMethod2(User user) {
    // Your custom implementation
  }
}

下面的例子顯示了一個擴展了CrudRepository的自定義倉庫的接口。

  • 例5. 修改你的repository接口定義, 讓它擴展多個你自定義接口
public interface UserRepository extends CrudRepository<User, Long>, HumanRepository, ContactRepository {
  // Declare query methods here
}

repository可以由多個自定義的實現(xiàn)組成,這些實現(xiàn)按其聲明的順序被導(dǎo)入。自定義實現(xiàn)的優(yōu)先級高于基礎(chǔ)實現(xiàn)和repository方面。這種排序可以讓你覆蓋基礎(chǔ)repository和方面的方法,并在兩個片段貢獻相同的方法簽名時解決歧義。repository片段不限于在單一repository接口中使用。多個repository可以使用一個片段接口,讓你在不同的repository中重復(fù)使用定制的內(nèi)容。

下面的例子顯示了一個repository片段和它的實現(xiàn)。

  • 例6. 重寫save(…)方法的片段代碼
public interface CustomSave<T> {
  <S extends T> S save(S entity);
}
public class CustomSaveImpl<T> implements CustomSave<T> {
  public <S extends T> S save(S entity) {
    // Your custom implementation
  }
}
  • 例7 在repository接口中擴展例6中定義的接口
interface UserRepository extends CrudRepository<User, Long>, CustomSave<User> {
}
interface PersonRepository extends CrudRepository<Person, Long>, CustomSave<Person> {
}

1.2 配置類

如果你使用命名空間配置,repository基礎(chǔ)設(shè)施會嘗試通過掃描發(fā)現(xiàn)repository的包下面的類來自動檢測自定義實現(xiàn)片段。這些類需要遵循命名空間元素的repository-impl-postfix屬性附加到片段接口名稱的命名慣例。這個后綴默認為 Impl。下面的例子顯示了一個使用默認后綴的repository和一個為后綴設(shè)置自定義值的repository。

XML文件的配置示例

<repositories base-package="com.kkarma.repository" />
<repositories base-package="com.kkarma.repository" repository-impl-postfix="MyImpl" />

前面例子中的第一個配置試圖查找一個叫做 com.kkatma.repository.CustomUserRepositoryImpl 的類,作為一個自定義的repository實現(xiàn)。第二個例子試圖查找 com.kkarma.repository.CustomUserRepositoryMyImpl。

1.3 解決歧義

如果在不同的包中發(fā)現(xiàn)有多個類名匹配的實現(xiàn),Spring Data會使用bean對象的名字來確定使用哪一個。

考慮到前面顯示的CustomUserRepository的以下兩個自定義實現(xiàn),第一個實現(xiàn)被使用。它的bean是customUserRepositoryImpl,與片段接口(CustomUserRepository)加上后綴Impl的名字相匹配。

  • 例8 解決歧義實現(xiàn)方式
package com.kkarma.impl.one;
class CustomUserRepositoryImpl implements CustomUserRepository {
  // Your custom implementation
}
package com.kkarma.impl.two;
@Component("specialCustomImpl")
class CustomUserRepositoryImpl implements CustomUserRepository {
  // Your custom implementation
}

如果你用 @Component("specialCustom")來注解 UserRepository接口,那么Bean的名字加上 Impl就與 com.kkarma.impl.two中為repository實現(xiàn)定義的名字相匹配,并被用來代替第一個接口。

1.4 手動裝配

如果你的自定義實現(xiàn)只使用基于注解的配置和自動裝配,前面所示的方法很好用,因為它被當作任何其他Spring Bean。如果你的實現(xiàn)片段Bean需要裝配到容器,你可以根據(jù)前文所述的約定來聲明Bean并為其命名。然后,基礎(chǔ)設(shè)施通過名稱來引用手動定義的Bean定義,而不是自己創(chuàng)建一個。下面的例子展示了如何手動裝配一個自定義的實現(xiàn)。

  • 例9 手動裝配自定義實現(xiàn)類對象到容器
<repositories base-package="com.kkarma.repository" />
<beans:bean id="userRepositoryImpl" class="…">
  <!-- further configuration -->
</beans:bean>

1.5 自定義Base Repository

當你想定制base repository的行為時,上一節(jié)描述的方法需要定制每個repository的接口,以便所有的repository都受到影響。為了改變所有repository的行為,你可以創(chuàng)建一個擴展持久化技術(shù)特定repository基類的實現(xiàn)。然后這個類作為repository代理的自定義基類,如下面的例子所示。

  • 例10 自定義repository的基類
class MyRepositoryImpl<T, ID> extends SimpleJpaRepository<T, ID> {
  private final EntityManager entityManager;
  MyRepositoryImpl(JpaEntityInformation entityInformation,
                          EntityManager entityManager) {
    super(entityInformation, entityManager);
    // Keep the EntityManager around to used from the newly introduced methods.
    this.entityManager = entityManager;
  }
  @Transactional
  public <S extends T> S save(S entity) {
    // implementation goes here
  }
}

最后一步是讓Spring Data基礎(chǔ)設(shè)施意識到自定義的repository基類。在Java配置中,你可以通過使用@Enable${store}Repositories注解的repositoryBaseClass屬性來做到這一點,如下面例子所示。

  • 例11 使用JavaConfig配置自定義repository基類
@Configuration
@EnableJpaRepositories(repositoryBaseClass = MyRepositoryImpl.class)
class ApplicationConfiguration { … }

在XML命名空間中有一個相應(yīng)的屬性,如下面的例子中所示。

  • 例12 使用XML配置自定義repository基類
<repositories base-package="com.kkarma.repository"
     base-class="….MyRepositoryImpl" />

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

相關(guān)文章

  • java線程池參數(shù)自定義設(shè)置詳解

    java線程池參數(shù)自定義設(shè)置詳解

    這篇文章主要為大家介紹了java線程池參數(shù)自定義設(shè)置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Java經(jīng)典設(shè)計模式之裝飾器模式解析

    Java經(jīng)典設(shè)計模式之裝飾器模式解析

    這篇文章主要介紹了Java經(jīng)典設(shè)計模式之裝飾器模式解析,裝飾器模式主要解決繼承關(guān)系過于復(fù)雜的問題,通過組合來替代繼承,指在不改變現(xiàn)有對象結(jié)構(gòu)的情況下,動態(tài)地給該對象增加一些職責(zé)(即增加其額外功能)的模式,需要的朋友可以參考下
    2023-08-08
  • Java多線程通信wait()和notify()代碼實例

    Java多線程通信wait()和notify()代碼實例

    這篇文章主要介紹了Java多線程通信wait()和notify()代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • springboot2.0使用Hikari連接池的方法(替換druid)

    springboot2.0使用Hikari連接池的方法(替換druid)

    這篇文章主要介紹了springboot 2.0使用Hikari連接池的方法(替換druid),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • springboot整合shardingjdbc實現(xiàn)分庫分表最簡單demo

    springboot整合shardingjdbc實現(xiàn)分庫分表最簡單demo

    我們知道分庫分表是針對某些數(shù)據(jù)量持續(xù)大幅增長的表,比如用戶表、訂單表等,而不是一刀切將全部表都做分片,這篇文章主要介紹了springboot整合shardingjdbc實現(xiàn)分庫分表最簡單demo,需要的朋友可以參考下
    2021-06-06
  • springbatch的封裝與使用實例詳解

    springbatch的封裝與使用實例詳解

    主要實現(xiàn)批量數(shù)據(jù)的處理,我對batch進行的封裝,提出了jobBase類型,具體job需要實現(xiàn)它即可。這篇文章主要介紹了springbatch的封裝與使用 ,需要的朋友可以參考下
    2019-04-04
  • 講解Java編程中finally語句的基本使用方法

    講解Java編程中finally語句的基本使用方法

    這篇文章主要介紹了講解Java編程中finally語句的基本使用方法,finally在異常處理中的使用時Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • Java中Stream實現(xiàn)List排序的六個核心技巧總結(jié)

    Java中Stream實現(xiàn)List排序的六個核心技巧總結(jié)

    這篇文章主要介紹了Java中Stream實現(xiàn)List排序的六個核心技巧,分別是自然序排序、反向排序、空值安全處理、多字段組合排序、并行流加速、原地排序等,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • Springboot如何實現(xiàn)Web系統(tǒng)License授權(quán)認證

    Springboot如何實現(xiàn)Web系統(tǒng)License授權(quán)認證

    這篇文章主要介紹了Springboot如何實現(xiàn)Web系統(tǒng)License授權(quán)認證,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • java中駝峰與下劃線的寫法互轉(zhuǎn)

    java中駝峰與下劃線的寫法互轉(zhuǎn)

    這篇文章主要介紹了java中駝峰與下橫線的寫法互轉(zhuǎn)方法,文中先是進行了簡單的介紹,之后跟大家分享了一個自己編寫的工具類的示例代碼,有需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-01-01

最新評論

灵宝市| 东莞市| 海城市| 新源县| 阳曲县| 信阳市| 察雅县| 绥芬河市| 奉节县| 九龙城区| 博爱县| 东明县| 江北区| 鄂州市| 治多县| 新津县| 四平市| 尚志市| 永和县| 乌拉特中旗| 墨江| 志丹县| 柳江县| 吴江市| 保德县| 乌苏市| 茂名市| 饶阳县| 肃宁县| 遂平县| 盐池县| 固安县| 鄢陵县| 衢州市| 陆河县| 霍林郭勒市| 宣城市| 墨脱县| 胶南市| 惠水县| 星子县|