日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

星云的 Spring Data JPA学习手册

發(fā)布時間:2023/12/9 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 星云的 Spring Data JPA学习手册 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

星云的 Spring Data JPA學習手冊

  • 0x01 為什么要學習Spring Data JPA?
    • 1.1 什么是Spring Data JPA?
    • 1.2 JPA的核心思想
    • 1.3 Spring Data JPA 1.11 新變化
  • 0x02 如何集成Spring Data JPA?
  • 0x03 Spring Data JPA 核心技術(shù)
    • 3.1 Spring Data JPA 是如何實現(xiàn)Repository的?
      • 3.3.1 Repository
      • 3.1.2 CrudRepository
      • 3.1.3 PagingAndSortingRepository
      • 3.1.4 JpaRepository
      • 3.1.5 自定義Repository
    • 3.2 Spring Data JPA 是如何實現(xiàn)接口的?
    • 3.3 如何正確使用Spring Data JPA ?
      • 3.3.1 定義一個繼承Repository類型的接口
      • 3.3.2 聲明遵循JPQL語法的自定義接口方法
      • 3.3.3 開啟查找Repository
        • 3.3.3.1 方式一 使用@Repository注解標記為Repository
        • 3.3.3.2 方式二 Java Config類中使用@EnableJpaRepositories查找Repository
        • 3.3.3.3 方式三 使用XML 配置方式查找Repository
      • 3.3.4 調(diào)用Repository
  • 0x04 項目信息
  • 0x05 參考資料

這篇博文主要講解 Spring Data JPA 技術(shù)的知識。

0x01 為什么要學習Spring Data JPA?

在碼農(nóng)的世界里有一句話,碼農(nóng)從來不做沒有目的的事情

那么為什么我們要學習Spring Data JPA 呢?

試想下,我們是否曾經(jīng)有過這樣的煩惱?

  • 當我們開發(fā)設(shè)計一款應用的時候,我們是不是第一步往往要手動創(chuàng)建業(yè)務實體類,然后再創(chuàng)建表?

  • 假設(shè)我們之前用的數(shù)據(jù)庫是MySQ,后來換成了Oracle,SQL語法有差異,你要手動修改所有的SQL么?

  • 程序部署每次換一個地方,我們是不是都要先手動根據(jù)實體類建立數(shù)據(jù)庫或?qū)隨Q語句?

如果你有以上這樣的苦惱, 那么來跟我一起來學習下Spring Data JPA吧~

  • Spring Data JPA 可以幫我們在實體類和數(shù)據(jù)庫表之間建立一個映射
  • Spring Data JPA 可以幫我們在程序啟動的時候完成數(shù)據(jù)庫和表的創(chuàng)建
  • Spring Data JPA 可以幫我們在程序啟動的時候插入一些測試數(shù)據(jù)
  • Spring Data JPA 可以幫我們屏蔽切換不同數(shù)據(jù)庫帶來的語法差異

1.1 什么是Spring Data JPA?

在知道Spring Data JPA能干什么之后,也許此時的你已經(jīng)心動了。

  • 如果你喜歡上了一個人,那就要努力去追求她,怎么追呢?首先你要了解她,分析她,知道她的習慣。
  • 如果你喜歡上了一個技術(shù),那就要努力去學習它,怎么學呢?首先你要了解它,分析它,知道它的規(guī)則。

那么就讓我們一起來了解下什么是Spring Data JPA吧。

那么什么是Spring Data JPA 呢?

  • Spring Data JPA 是Spring Data 龐大家族的一員,它幫助我們簡化了基于JPA的 repositories (存儲庫)的開發(fā)。

那傳說中的JPA ,Spring Data JPA 和Hibernate 又是什么關(guān)系呢?

JPA和Spring Data JPA 和 以及Hibernate的關(guān)系如下圖所示:

正如上圖所示

  • JPA 是Java Persistence API 的英文縮寫,中文名Java持久層API.
  • 值得注意的是JPA 是Java 持久化規(guī)范,并不是持久層框架。
  • Spring Data JPA (Java Persistence API) 也不是ORM框架,而只是一種ORM規(guī)范(標準接口)和對JPA規(guī)范的抽象
  • Spring Data JPA 實現(xiàn)了JPA規(guī)范并默認使用Hiberante作為底層實現(xiàn),如果想,也可以把Hiberante 換成其他ORM框架,比如TopLink等。
  • Sun引入新的JPA ORM規(guī)范其實出于兩個原因:
    • 其一,為了簡化持久層開發(fā)以及整合ORM技術(shù);
    • 其二,結(jié)束Hibernate、TopLink、JDO等ORM框架各自為營的局面,實現(xiàn)天下歸一的目的

Tips: 秦始皇統(tǒng)一度量衡,因此天下大興,ORM框架也一樣。

1.2 JPA的核心思想

那么 JPA 規(guī)范到底規(guī)定了什么?

  • JPA 的核心設(shè)計思想和Hibernate 是一致的,致力于以一種面向?qū)ο蟮恼Z法來操作SQL.
  • JPA 提出了repository support (存儲庫支持)的設(shè)計思想,簡單點來講就是說對常用的增刪改查以及分頁查詢排序等提供了默認實現(xiàn),以簡化Java 持久層的開發(fā)。
  • 業(yè)務實體類和數(shù)據(jù)庫表之間通過@Column @Table 等注解建立映射
  • 支持@Query 注解編寫原生的SQL

以一種面向?qū)ο蟮恼Z法(JPQL語言)來操作SQL

如果你不太理解什么叫做以一種面向?qū)ο蟮恼Z法來操作SQL,那么看下下表應該就明白了

下表描述了JPA支持的關(guān)鍵字以及包含該關(guān)鍵字的方法轉(zhuǎn)換為:

KeywordSampleJPQL代碼段
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEquals… where x.firstname = ?1
BetweenfindByStartDateBetween… where x.startDate between ?1 and ?2
LessThanfindByAgeLessThan… where x.age < ?1
LessThanEqualfindByAgeLessThanEqual… where x.age <= ?1
GreaterThanfindByAgeGreaterThan… where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual… where x.age >= ?1
AfterfindByStartDateAfter… where x.startDate > ?1
BeforefindByStartDateBefore… where x.startDate < ?1
IsNullfindByAgeIsNull… where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull… where x.age not null
LikefindByFirstnameLike… where x.firstname like ?1
NotLikefindByFirstnameNotLike… where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith… where x.firstname like ?1 (parameter bound with appended %)
EndingWithfindByFirstnameEndingWith… where x.firstname like ?1 (parameter bound with prepended %)
ContainingfindByFirstnameContaining… where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc… where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot… where x.lastname <> ?1
InfindByAgeIn(Collection ages)… where x.age in ?1
NotInfindByAgeNotIn(Collection ages)… where x.age not in ?1
TruefindByActiveTrue()… where x.active = true
FalsefindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

1.3 Spring Data JPA 1.11 新變化

Spring Data JPA 1.11 版本改動如下:

  • 改進了與Hibernate 5.2 的兼容性
  • 增加了Query by Example.任意匹配模式的支持 (根據(jù)傳入對象,多條件查詢)
  • 分頁查詢執(zhí)行優(yōu)化
  • 支持自定義擴展repository.

0x02 如何集成Spring Data JPA?

在我看來,技術(shù)應該是免費的,共享的,技術(shù)是用來解決問題的,用技術(shù)解決企業(yè)的需求問題才是應該需要付費的。

我們已經(jīng)大致了解了Spring Data JPA 的相關(guān)概念和為什么要學習它以及它解決了什么問題,那么Spring Boot 和Spring Data JPA 應該如何集成呢?

我們只需要在我們項目的pom.xml 中添加如下依賴即可:

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-jpa</artifactId></dependency>

其次,值得注意的是, 如果使用最新版的Spring Data JPA有兩個最低要求

  • JDK8+
  • Spring Framework 5.1.9.RELEASE +

對于一些比較大的項目,往往會引入很多依賴,其中某個依賴中可能會由于傳遞依賴引入不同的Spring data JPA 版本
如果你想解決這種兼容性問題,那么我們需要在pom.xml中添加如下依賴即可

<dependencyManagement> <dependencies><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-releasetrain</artifactId><version>Lovelace-SR10</version><scope>import</scope><type>pom</type></dependency> </dependencies> </dependencyManagement>

點擊查看配置示例

0x03 Spring Data JPA 核心技術(shù)

Spring Data repository (repository)抽象的目的是為了減少各種持久性存儲實現(xiàn)需要寫的增刪改查,分頁以及排序等模板代碼。

3.1 Spring Data JPA 是如何實現(xiàn)Repository的?

接下來我們來學習下Spring Data JPA 是如何實現(xiàn)Repository的?

這里我們可以思考下,如果讓你去設(shè)計實現(xiàn)增刪改查,分頁以及排序模板代碼,你會怎么設(shè)計?

我覺得如果是我的話,如果想要做到上面那樣的需求,按照我的理解

  • 首先我們至少需要指明一個實體類然后通過反射獲取實體類的成員屬性
  • 之后指定主鍵是哪一個,以及指明主鍵ID的類型

Spring Data JPA 是這么設(shè)計的,它設(shè)計了很多接口類

  • 最頂級接口 Repository
  • 返回帶游標結(jié)果的接口 CrudRepository
  • 處理分頁和排序的接口 PagingAndSortingRepository
  • 返回Java 對象的接口 JpaRepository
  • 返回MongoDB 對象的接口 MongoRepository

接下來我們詳細介紹下這幾個接口類

3.3.1 Repository

正如我們剛才看到的那樣,Repository 是Spring Data JPA中最頂級的接口,在這個接口類中并沒有定義任何接口方法。

import org.springframework.stereotype.Indexed;@Indexed public interface Repository<T, ID> { }
  • 關(guān)于 @Indexed
    • 該注解只是一個標識索引注解,官方文檔上沒找到對它的詳細解釋
    • 但是想想也應該明白,它應該只是用來區(qū)分當前類是普通接口類還是Spring Data JPA Repository (存儲庫) 接口類的一個注解。
    • 而且有了這個注解,我們也可以很方便通過掃描包的方式找到該類型的接口。
  • 關(guān)于<T, ID>
    • 雖然這個方法沒有定義任何接口方法,但是它做了一個最頂級的抽象,T 泛型,代指任意持久化類,ID 泛型,任意對象類型,代指主鍵ID類型
    • 我們知道對于一張表來說,最重要的就是表的各個字段名稱和類型屬性,以及表的主鍵信息,一旦我們獲取了T,和ID,我們就可以通過反射來獲取這些信息,然后鼓搗做一些事情。

如果只有上面這個接口的功能,很明顯是遠遠不夠的。

因此Spring Data JPA 還提供了另外一個類CrudRepository

3.1.2 CrudRepository

CrudRepository 這個接口類繼承自Repository接口,不僅擁有父類的功能,它還增加數(shù)據(jù)庫幾乎常用的增刪改查的所有方法。

import java.util.Optional;@NoRepositoryBean public interface CrudRepository<T, ID> extends Repository<T, ID> {<S extends T> S save(S var1);//保存一個對象<S extends T> Iterable<S> saveAll(Iterable<S> var1);//保存多個對象Optional<T> findById(ID var1);//根據(jù)主鍵ID查找一個對象boolean existsById(ID var1);//根據(jù)主鍵ID查找一個對象是否存在Iterable<T> findAll();//查找所有對象Iterable<T> findAllById(Iterable<ID> var1);//根據(jù)Id集合查找所有符合條件集合long count();//統(tǒng)計當前實體類中擁有的對象void deleteById(ID var1);//根據(jù)主鍵ID刪除一個對象void delete(T var1);//根據(jù)一個對象刪除該對象void deleteAll(Iterable<? extends T> var1);//根據(jù)多個對象刪除多個對象void deleteAll();//刪除所有對象 }
  • 使用了@NoRepositoryBean注解的接口,就不會在運行時為其自動生成實現(xiàn)類。
  • 這個接口返回的對象集合是帶迭代器的結(jié)果。

3.1.3 PagingAndSortingRepository

PagingAndSortingRepository 接口繼承自CrudRepository ,不僅擁有父類的全部功能還增加了分頁和排序的功能

import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort;@NoRepositoryBean public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {Iterable<T> findAll(Sort var1);Page<T> findAll(Pageable var1); }

對于Pageable 這個對象我們可能剛開始比較陌生,那么如何使用呢?

調(diào)用方法如下所示:

PagingAndSortingRepository<User, Long> repository = // … get access to a bean Page<User> users = repository.findAll(PageRequest.of(1, 20));

3.1.4 JpaRepository

JpaRepository 接口繼承自PagingAndSortingRepository,不僅擁有以上三種接口的所有功能,還將CrudRepository接口中的返回的迭代器集合變成了更加友好的Java對象集合,除此之外還增加了一個新功能 Example 方式查詢。

框架源碼如下:

import java.util.List; import org.springframework.data.domain.Example; import org.springframework.data.domain.Sort; import org.springframework.data.repository.NoRepositoryBean; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.query.QueryByExampleExecutor;@NoRepositoryBean public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {List<T> findAll();//查找所有對象返回一個更友好的Java集合對象List<T> findAll(Sort var1);List<T> findAllById(Iterable<ID> var1);<S extends T> List<S> saveAll(Iterable<S> var1);void flush();<S extends T> S saveAndFlush(S var1);void deleteInBatch(Iterable<T> var1);void deleteAllInBatch();T getOne(ID var1);<S extends T> List<S> findAll(Example<S> var1);<S extends T> List<S> findAll(Example<S> var1, Sort var2); }

其他的比較簡單就不廢話了,咱們來聊聊什么是Example 方式查詢。

如果我們打開QueryByExampleExecutor.java可以看到如下內(nèi)容

public interface QueryByExampleExecutor<T> {<S extends T> Optional<S> findOne(Example<S> var1);<S extends T> Iterable<S> findAll(Example<S> var1);<S extends T> Iterable<S> findAll(Example<S> var1, Sort var2);<S extends T> Page<S> findAll(Example<S> var1, Pageable var2);<S extends T> long count(Example<S> var1);<S extends T> boolean exists(Example<S> var1); }

這種新型的方式該怎么用呢?

我這里貼一段示例代碼大家看下應該就明白了

import com.xingyun.springbootwitheasyshopsample.dao.repository.UserRepository; import com.xingyun.springbootwitheasyshopsample.model.User; import com.xingyun.springbootwitheasyshopsample.model.dto.UserDto; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Example; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service;import java.util.List; import java.util.Optional;/*** @author 星云* @功能* @date 9/22/2019 11:45 AM*/ @Service public class UserServiceImpl implements UserService {@AutowiredUserRepository userRepository;@Overridepublic Page<User> getPage(Pageable pageable) {//這里直接使用Jpa提供的分頁查詢功能return this.userRepository.findAll(pageable);}@Overridepublic List<User> showAllUser() {return userRepository.findAll();}@Overridepublic User load(Long id) {//封裝查詢條件User findUser=new User();findUser.setId(id);//轉(zhuǎn)換成查詢對象Example<User> findUserExample=Example.of(findUser);//獲取查詢結(jié)果Optional<User> resultUserWithOptional=this.userRepository.findOne(findUserExample);if(resultUserWithOptional.isPresent()){//獲取業(yè)務實體類return resultUserWithOptional.get();}else{return null;}}@Overridepublic User save(UserDto user) {User queryUser=new User();queryUser.setId(user.getId());//轉(zhuǎn)換成查詢對象Example<User> checkUserExample=Example.of(queryUser);//獲取查詢結(jié)果Optional<User> findUserWithOptional=this.userRepository.findOne(checkUserExample);//返回用戶User checkUser;if(findUserWithOptional.isPresent()){//返回用戶checkUser=findUserWithOptional.get();}else{//如果對象為空//創(chuàng)建一個對象checkUser=new User();//設(shè)置要保存的對象屬性checkUser.setAvatar(user.getAvatar());checkUser.setNickName(user.getNickName());}return this.userRepository.save(checkUser);}@Overridepublic void delete(Long id) {//根據(jù)Id 刪除某一個用戶this.userRepository.deleteById(id);} }

看明白了么?這種方式使得多條件查詢變得更加靈活。

我們可以傳一個對象,只要對象的某個值不為空,就按照該屬性作為條件進行查找。

我覺得這種實現(xiàn)方式很類似MyBatis 中的這種if 條件語句寫法

示例代碼如下:

<select id="selectAllUserInfoByCondition"parameterType="map"resultMap="userInfoMap">SELECT<include refid="userInfoFieldSQLId"/>FROM t_user_info<where><if test="userInfoAccount!=null and ''!=userInfoAccount">AND USER_INFO_ACCOUNT = #{userInfoAccount}</if><if test="null!=userInfoPassword and ''!=userInfoPassword ">AND USER_INFO_PASSWORD= #{userInfoPassword}</if><if test="null!=userInfoAge and 0!=userInfoAge ">AND USER_INFO_AGE= #{userInfoAge}</if><if test="null!=userInfoSex ">AND USER_INFO_SEX= #{userInfoSex}</if><if test="null!=userInfoId and 0L!=userInfoId ">AND USER_INFO_ID= #{userInfoId}</if></where></select>

關(guān)于返回MongoDB 對象的接口 MongoRepository 不屬于本節(jié)課的內(nèi)容暫時跳過。

3.1.5 自定義Repository

上面中我們講解了Spring Data JPA 已經(jīng)提到了如下幾種 Repository

  • Repository
  • 返回游標的接口:CrudRepository
  • 處理分頁和排序的接口:PagingAndSortingRepository
  • 返回Java 對象的接口:JpaRepository
  • 返回MongoDB 對象的接口:MongoRepository

現(xiàn)在假如我們有這一種場景,有兩個類中有一些公共的接口需要實現(xiàn),那么應該怎么做呢?

  • 定義一個接口但是要用@NoRepositoryBean注解
@NoRepositoryBean interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {Optional<T> findById(ID id);<S extends T> S save(S entity); }
  • 使用這個注解不會在運行時自動生成這個MyBaseRepository接口的實現(xiàn)類
  • 其次,值得注意的是,ID extends Serializable 必須有這一句。

然后編寫我們自己的類繼承自這個公共類

interface UserRepository extends MyBaseRepository<User, Long> {User findByEmailAddress(EmailAddress emailAddress); }

Spring Data JPA 會按照我們上面剛才的方法找到這個類,然后為這個類在運行時實現(xiàn)接口類的方法。

如果不想使用Spring Data JPA 自動幫我們實現(xiàn)實現(xiàn)類,那么我們也可以這么做

  • 定義一個接口
interface CustomizedUserRepository {void someCustomMethod(User user); }
  • 自己編寫代碼實現(xiàn)類
class CustomizedUserRepositoryImpl implements CustomizedUserRepository {public void someCustomMethod(User user) {// Your custom implementation} }

最后編寫調(diào)用注入的接口層

interface UserRepository extends CrudRepository<User, Long>, CustomizedUserRepository {// Declare query methods here }

3.2 Spring Data JPA 是如何實現(xiàn)接口的?

思考:

  • 學習到這里我不知道你是不是有些疑惑,我們剛才只是定義了接口,這些接口的實現(xiàn)類在哪里?
  • 這事我們沒做,那么肯定是Spring Data JPA偷偷把這個活干了,那么Spring Data JPA 是如何實現(xiàn)Repository 接口類的呢?

我們打開Spring Data JPA 源碼來看看,可以看到JpaRepository接口的實現(xiàn)類是這么做的。

  • 首先定義一個實現(xiàn)類擴展接口JpaRepositoryImplementation<T, ID>

源碼如下:

public interface JpaRepositoryImplementation<T, ID> extends JpaRepository<T, ID>, JpaSpecificationExecutor<T> {... }
  • 然后定義一個最簡單的默認的實現(xiàn)類SimpleJpaRepository.java

源碼如下:

public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {... }
  • 一旦檢測該接口是Spring Data JPA Repository就自動默認使用該實現(xiàn)類
  • 具體的一些細節(jié)就不展開細講了,有興趣可以自己打開看看,我只負責拋一個磚,至于砸到你頭上是起一個疙瘩,還是能引出來一塊玉,全看個人造化。笑.svg

3.3 如何正確使用Spring Data JPA ?

3.3.1 定義一個繼承Repository類型的接口

使用的第一步,我們需要定義一個繼承Repository類型 的接口

當然這個接口我們可以使用Repository

interface PersonRepository extends Repository<Person, Long> { }

也可以使用CrudRepository

interface PersonRepository extends CrudRepository<Person, Long> { }

甚至也可以是JpaRepository

interface PersonRepository extends JpaRepository<Person, Long> { }

不過我覺得最好使用最后一種JpaRepository ,功能最多,返回的不是迭代器對象,而是List<Object>,并且提供了Example多條件復合查詢。

3.3.2 聲明遵循JPQL語法的自定義接口方法

然后如果默認的接口中的方法不能滿足我們的需要,我們也可以自定義遵循JPQL語法的接口方法

interface PersonRepository extends JpaRepository<Person, Long> {List<Person> findByLastname(String lastname); }

多學一招,如果想使用原生的SQL,也可以使用@Query注解

public interface UserRepository extends JpaRepository<User,Long> {@Query("select u from User u where u.emailAddress = ?1",nativeQuery = true) User findByEmailAddress(String emailAddress); }

?1 為占位符,會將?1 用第一個參數(shù)的值替換掉

  • 如果是帶分頁的那種寫法是這樣
public interface UserRepository extends JpaRepository<User, Long> {@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",nativeQuery = true) Page<User> findByLastname(String lastname, Pageable pageable); }

3.3.3 開啟查找Repository

接下來,我們需要告訴Spring Data JPA 哪些是普通的接口類,哪些是Spring Data JPA Repository接口類。

3.3.3.1 方式一 使用@Repository注解標記為Repository

@Repository interface PersonRepository extends JpaRepository<Person, Long> {List<Person> findByLastname(String lastname); }

Spring Data JPA 支持使用Java Config 來開啟包掃描
為此,我們需要創(chuàng)建一個Java Config 類,然后使用@EnableJpaRepositories注解

import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories;@EnableJpaRepositories @Configuration public class JpaConfig { }
  • 請注意,我們這里@EnableJpaRepositories注解并沒有顯式配置程序包,因為默認情況下Spring Data JPA 會查找使用了@Repository注解的接口類

3.3.3.2 方式二 Java Config類中使用@EnableJpaRepositories查找Repository

方式一那種寫法其實存在個缺點,如果我們的項目中一個類繼承了JpaRepository,另外一個類繼承了MongoRepository,那么程序啟動可能就會報錯,因此我們最好指明使用Jpa存儲庫的包路徑,像下面這樣:

import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories;@EnableJpaRepositories(basePackages = "com.acme.repositories.jpa") @Configuration public class JpaConfig { }

3.3.3.3 方式三 使用XML 配置方式查找Repository

如果不喜歡用上面的 Java Config 方式,也可以使用傳統(tǒng)的xml配置方式

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jpa="http://www.springframework.org/schema/data/jpa"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/data/jpahttps://www.springframework.org/schema/data/jpa/spring-jpa.xsd"><jpa:repositories base-package="com.acme.repositories"/></beans

3.3.4 調(diào)用Repository

最后我們開始調(diào)用我們的Repository(存儲庫)方法

示例代碼如下:

class SomeClient {private final PersonRepository repository;SomeClient(PersonRepository repository) {this.repository = repository;}void doSomething() {List<Person> persons = repository.findByLastname("Matthews");} }

但是我們其實一般都不這么用。。。

個人感覺比較優(yōu)雅的一種方式是這種:

class SomeClient {@AutowiredPersonRepository repository;void doSomething() {List<Person> persons = repository.findByLastname("Matthews");} }

0x04 項目信息

  • 版本控制-項目開發(fā)進展或參與項目開發(fā)

  • Bug跟蹤 - 提Bug在這里提問

  • 正式版本發(fā)布倉庫- 正式發(fā)布的穩(wěn)定版本

  • 里程碑版本發(fā)布倉庫- 改動比較大的版本

  • 快照版本發(fā)布倉庫- 嘗鮮版最新開發(fā)的功能

0x05 參考資料

  • spring-data-jpa官網(wǎng)
  • Spring Data JPA - Reference Documentation
  • 官方Spring Data JPA 使用示例
  • SpringBoot學習筆記九:Spring Data Jpa的使用

本節(jié)完~

下篇預告,Spring Boot with Spring Data JPA Sample

  • 交流即分享,分享才能進步 by 星云
  • 如果你喜歡我的博文,歡迎點贊+關(guān)注~

總結(jié)

以上是生活随笔為你收集整理的星云的 Spring Data JPA学习手册的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。