真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

淺談SpringData如何簡(jiǎn)化數(shù)據(jù)操作的方法

Spring Data 概述

創(chuàng)新互聯(lián)建站是一家以重慶網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、品牌設(shè)計(jì)、軟件運(yùn)維、成都網(wǎng)站營(yíng)銷(xiāo)、小程序App開(kāi)發(fā)等移動(dòng)開(kāi)發(fā)為一體互聯(lián)網(wǎng)公司。已累計(jì)為成都戶外休閑椅等眾行業(yè)中小客戶提供優(yōu)質(zhì)的互聯(lián)網(wǎng)建站和軟件開(kāi)發(fā)服務(wù)。

Spring Data

用于簡(jiǎn)化數(shù)據(jù)庫(kù)訪問(wèn),支持NOSQL 和 關(guān)系數(shù)據(jù)存儲(chǔ),其主要目標(biāo)是使數(shù)據(jù)庫(kù)的訪問(wèn)變得方便快捷。
SpringData 項(xiàng)目所支持 NoSQL 存儲(chǔ):
MongoDB (文檔數(shù)據(jù)庫(kù))
Neo4j(圖形數(shù)據(jù)庫(kù))
redis(鍵/值存儲(chǔ))
Hbase(列族數(shù)據(jù)庫(kù))
SpringData 項(xiàng)目所支持的關(guān)系數(shù)據(jù)存儲(chǔ)技術(shù):
JDBC
JPA

Spring Data JPA

JPA Spring Data : 致力于減少數(shù)據(jù)訪問(wèn)層 (DAO) 的開(kāi)發(fā)量. 開(kāi)發(fā)者唯一要做的,就只是聲明持久層的接口,其他都交給 Spring Data JPA 來(lái)幫你完成!

開(kāi)發(fā)步驟

配置 Spring 整合 JPA

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

聲明持久層的接口,該接口繼承 Repository,Repository 是一個(gè)標(biāo)記型接口,它不包含任何方法,如必要,Spring Data 可實(shí)現(xiàn) Repository 其他子接口,其中定義了一些常用的增刪改查,以及分頁(yè)相關(guān)的方法。

在接口中聲明需要的方法,Spring Data 將根據(jù)給定的策略來(lái)為其生成實(shí)現(xiàn)代碼。

搭建環(huán)境

導(dǎo)包:

antlr-2.7.7.jar
c3p0-0.9.2.1.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.3.jar
dom4j-1.6.1.jar
hamcrest-core-1.3.jar
hibernate-c3p0-4.2.4.Final.jar
hibernate-commons-annotations-4.0.2.Final.jar
hibernate-core-4.2.4.Final.jar
hibernate-entitymanager-4.2.4.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.1.Final.jar
junit-4.12.jar
mchange-commons-java-0.2.3.4.jar
MySQL-connector-java-5.1.7-bin.jar
slf4j-api-1.6.1.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-data-commons-1.6.2.RELEASE.jar
spring-data-jpa-1.4.2.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

  
  
  
  
    
    
    
    
  
  
  
    
    
      
    
    
    
      
        
        org.hibernate.cfg.ImprovedNamingStrategy
        
        org.hibernate.dialect.MySQL5InnoDBDialect
        true
        true
        update
      
    
  
  
  
    
  
  
  
  
  

Repository 接口

Repository 接口是 Spring Data 的一個(gè)核心接口,不提供任何方法,只要遵循接口方法定義規(guī)范,就無(wú)需寫(xiě)實(shí)現(xiàn)類(lèi),與繼承 Repository 接口等價(jià)的一種方式,就是在持久層接口上使用 @RepositoryDefinition 注解,并為其指定domainClass 和 idClass 屬性。

Repository 的子接口

Repository: 僅僅是一個(gè)標(biāo)識(shí),表明任何繼承它的均為倉(cāng)庫(kù)接口類(lèi)。

CrudRepository: 繼承 Repository,實(shí)現(xiàn)了一組 CRUD 相關(guān)的方法 。

PagingAndSortingRepository: 繼承 CrudRepository,實(shí)現(xiàn)了一組分頁(yè)排序相關(guān)的方法 。

JpaRepository: 繼承 PagingAndSortingRepository,實(shí)現(xiàn)一組 JPA 規(guī)范相關(guān)的方法 。

自定義的 XxxxRepository 需要繼承 JpaRepository,這樣的 XxxxRepository 接口就具備了通用的數(shù)據(jù)訪問(wèn)控制層的能力。

JpaSpecificationExecutor: 不屬于Repository體系,實(shí)現(xiàn)一組 JPA Criteria 查詢相關(guān)的方法 。

Spring Data 方法定義規(guī)范

簡(jiǎn)單條件查詢,查詢某一個(gè)實(shí)體或者集合,查詢方法以 get、find、read 開(kāi)頭,涉及條件查詢時(shí),條件的屬性用關(guān)鍵字連接,條件屬性以首字母大寫(xiě)。

例如

public interface PersonRepository extends Repository {
  Person getByLastName(String lastName);

  List getByLastNameStartingWithAndIdLessThan(String lastName, Integer id);

  List getByLastNameEndingWithAndIdLessThan(String lastName, Integer id);

  List getByEmailInAndAgeLessThan(List list, Integer id);

  List getByAddress_IdGreaterThan(Integer id);
}

Spring Data 支持的關(guān)鍵字

KeywordSampleJPQL snippet
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?
BetweefindByStartDateBetween… 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 age)… where x.age not in ?1
TruefindByActiveTrue()… where x.active = true
FalsefindByActiveFalse()… where x.active = false
IgnoreCasefindByFirstnameIgnoreCase… where UPPER(x.firstame) = UPPER(?1)

@Query 注解

這種查詢可以聲明在 Repository 方法中,擺脫像命名查詢那樣的約束,將查詢直接在相應(yīng)的接口方法中聲明,結(jié)構(gòu)更為清晰,這是 Spring Data 的特有實(shí)現(xiàn)。

索引參數(shù):

索引值從1開(kāi)始,查詢中 ?x 的個(gè)數(shù)需要與方法形參個(gè)數(shù)相等,并且順序也要一致。

@Query("SELECT p FROM Person p WHERE p.lastName = ?1 and p.age = ?2")
Person getByLastNameAndAge(String lastName, int age);

命名參數(shù):

可以定義好參數(shù)名,賦值值采用 @Param(參數(shù)名),而不用管順序。

@Query("SELECT p FROM Person p WHERE p.lastName = :lastName and p.id = :id")
Person getByLastNameAndId(@Param("id")int id, @Param("lastName")String lastName);

本地查詢:

可以使用 @Query 執(zhí)行本地查詢,只要設(shè)置 nativeQuery 為 true。

@Query(value = "SELECT COUNT (id) FROM jpa_persons", nativeQuery = true)
long getTotalCount();

@Modifying 注解和事務(wù)

@Query 與 @Modifying 這兩個(gè)注解一起使用,可以執(zhí)行 UPDATE、DELETE 操作。

注意,UPDATE、DELETE 需要使用事務(wù),因此需要定義在 Service 層。

事務(wù):

Spring Data 提供了默認(rèn)的事務(wù)處理方式,即所有的查詢均為只讀事務(wù)。

對(duì)于自定義的方法,如需改變 Spring Data 提供的事務(wù)方式,可以在方法上添加 @Transactional 注解。

進(jìn)行多個(gè) Repository 操作時(shí),也應(yīng)該使它們?cè)谕粋€(gè)事務(wù)中處理,按照分層架構(gòu)的思想,這部分屬于業(yè)務(wù)邏輯層,因此,需要在 Service 層實(shí)現(xiàn)對(duì)多個(gè) Repository 的調(diào)用,并在相應(yīng)的方法上聲明事務(wù)。

CrudRepository 接口

CrudRepository 接口提供了最基本的對(duì)實(shí)體類(lèi)的添刪改查操作
T save(T entity) 保存單個(gè)實(shí)體
Iterable save(Iterable<? extends T> entities) 保存集合
T findOne(ID id) 根據(jù)id查找實(shí)體
boolean exists(ID id) 根據(jù)id判斷實(shí)體是否存在
Iterable findAll() 查詢所有實(shí)體,不用或慎用
long count() 查詢實(shí)體數(shù)量
void delete(ID id) 根據(jù)Id刪除實(shí)體
void delete(T entity) 刪除一個(gè)實(shí)體
void delete(Iterable<? extends T> entities) 刪除一個(gè)實(shí)體的集合
void deleteAll() 刪除所有實(shí)體,不用或慎用

PagingAndSortingRepository 接口

該接口提供了分頁(yè)與排序功能

Iterable findAll(Sort sort) 排序

Page findAll(Pageable pageable) 分頁(yè)查詢(含排序功能)

@Test
public void testPagingAndSortingRespository(){
  int pageNo = 3;
  int pageSize = 5;
  Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
  Sort.Order order1 = new Sort.Order(Sort.Direction.ASC, "email");
  Sort sort = new Sort(order,order1);
  PageRequest pageable = new PageRequest(pageNo, pageSize, sort);
  Page page = personRepository.findAll(pageable);
  System.out.println(page.getNumberOfElements());
  System.out.println(page.getContent());
}

JpaRepository 接口

該接口提供了JPA的相關(guān)功能

List findAll() 查找所有實(shí)體

List findAll(Sort sort) 排序、查找所有實(shí)體

List save(Iterable<? extends T> entities) 保存集合

void flush() 執(zhí)行緩存與數(shù)據(jù)庫(kù)同步

T saveAndFlush(T entity) 強(qiáng)制執(zhí)行持久化

void deleteInBatch(Iterable entities) 刪除一個(gè)實(shí)體集合

JpaSpecificationExecutor 接口

不屬于Repository體系,實(shí)現(xiàn)一組 JPA Criteria 查詢相關(guān)的方法

Specification:封裝 JPA Criteria 查詢條件。通常使用匿名內(nèi)部類(lèi)的方式來(lái)創(chuàng)建該接口的對(duì)象

@Test
public void testJpaSpecificationExecutor(){
  int pageNo = 3;
  int pageSize = 5;
  PageRequest pageable = new PageRequest(pageNo, pageSize);
  Specification specification = new Specification() {
    /**
       * @param root 代表查詢的實(shí)體類(lèi)
       * @param criteriaQuery 可以從中得到root對(duì)象,即告知 JPA Criteria 查詢哪個(gè)實(shí)體類(lèi),
       *           還可以添加查詢條件,還可以結(jié)合EntityManager對(duì)象得到最終查詢的                  TypedQuery
       * @param criteriaBuilder 用于創(chuàng)建criteria工廠
       * @return Predicate類(lèi)型,代表一個(gè)查詢條件
       */
    @Override
    public Predicate toPredicate(Root root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
      Predicate predicate = criteriaBuilder.ge(root.get("id"),5);
      return predicate;
    }
  };
  Page page = personRepository.findAll(specification, pageable);
  System.out.println(page.getNumberOfElements());
  System.out.println(page.getContent());
}

自定義 Repository 方法

為某一個(gè) Repository 上添加自定義方法

創(chuàng)建一個(gè) XXXDAO 接口,聲明接口方法。

創(chuàng)建一個(gè) XXXRepository 接口,并繼承 XXXDAO 接口。

提供 XXXRepository 的實(shí)現(xiàn)類(lèi) XXXRepositoryImpl,并實(shí)現(xiàn) XXXDAO 定義的接口方法。

實(shí)際上在使用 XXXRepository 的自定義方法時(shí)會(huì)調(diào)用 XXXRepositoryImpl 中的實(shí)現(xiàn)。

為所有的 Repository 都添加自實(shí)現(xiàn)的方法

創(chuàng)建一個(gè) XXXRepository 接口,需要繼承 創(chuàng)建一個(gè) Repository 接口。

提供 XXXRepository 的實(shí)現(xiàn)類(lèi) XXXRepositoryImpl,且繼承 SimpleJpaRepository,并提供方法的實(shí)現(xiàn)。

定義 JpaRepositoryFactoryBean 的實(shí)現(xiàn)類(lèi),使其生成 XXXRepository 的接口實(shí)現(xiàn)類(lèi)的對(duì)象。

修改 \ 節(jié)點(diǎn)的 factory-class 屬性指向 JpaRepositoryFactoryBean 的實(shí)現(xiàn)類(lèi)的全類(lèi)名。

注意:

全局的擴(kuò)展實(shí)現(xiàn)類(lèi)不要用 Imp 作為后綴名,

或者為全局?jǐn)U展接口添加 @NoRepositoryBean注解告知 SpringData 不要把其作為 Repository。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


網(wǎng)頁(yè)名稱(chēng):淺談SpringData如何簡(jiǎn)化數(shù)據(jù)操作的方法
網(wǎng)站路徑:http://weahome.cn/article/gdcjoc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部