Spring框架系列(四)-Spring Data JPA簡介

附上示例程序的github地址:https://github.com/bjtudujunlin/SpringDataExample



一、 概述

SpringData是一個數據訪問框架,基於Spring實現,旨在提供一致的數據庫訪問模型,同時仍然保留不同數據庫底層數據存儲的特點。Spring Data由一些列的組件組成,分別對應不同數據庫具體實現。Spring Data爲你實現了訪問關係型數據庫、非關係型數據庫的統一的接口,對於常見的企業級CURD、排序操作不需要手動添加任何sql語句,同時也支持手動擴展功能。下面是Spring Data的組件,比如Spring Data JPA支持關係型數據庫操作,Spring Data Elasticsearch支持對Elasticsearch的操作,對於用戶來說,使用的是同一套接口,這就很方便了。

同時由於Spring Data採用了“領域驅動模型”的設計思想,用戶不需要與數據庫直接打交道,只需要定義好領域模型(對象類),後續的創建表、CURD等操作,Spring Data統統幫你做完。下面是spring data框架中的組件。

·       Spring Data Commons

·       Spring Data JPA

·       Spring Data KeyValue

·       Spring Data LDAP

·       Spring Data MongoDB

·       Spring Data Gemfire

·       Spring Data REST

·       Spring Data Redis

·       Spring Data for Apache Cassandra

·       Spring Data for Apache Solr

·       Spring Data Couchbase (community module)

·       Spring Data Elasticsearch (communitymodule)

·       Spring Data Neo4j (community module)

二、 Repository

SpringData中最核心的概念就是RepositoryRepository是一個抽象的接口,用戶通過該接口來實現數據的訪問。這次的內容基於Spring Data JPA進行介紹,Spring Data JPA提供了關係型數據庫訪問的一致性,在該組件中,Repository包括CrudRepositoryPagingAndSortingRepository兩類。

1、CurdRepository

public interface CrudRepository<T, ID extends Serializable>extends Repository<T, ID> {

    <S extends T> S save(Sentity);

    <S extends T> Iterable<S> save(Iterable<S>entities);

    T findOne(ID id);

    boolean exists(IDid);

    Iterable<T> findAll();

    Iterable<T> findAll(Iterable<ID> ids);

    long count();

    void delete(IDid);

    void delete(Tentity);

    void delete(Iterable<?extends T> entities);

    void deleteAll();

}

 

CrudRepository接口實現了savedeletecountexistsfindOne等方法,方法的意思從名字上很容易理解,繼承這個接口時需要兩個模板參數TIDT就是你的實體類(對應數據庫表),ID就是主鍵。

在使用中,用戶需要繼承這個接口,Customer就是定義的實體,Long是主鍵類型

public interface CustomerRepository extends CrudRepository<Customer, Long>

 

2PagingAndSortingRepository

public interface PagingAndSortingRepository<T, IDextends Serializable> extends CrudRepository<T, ID> {

    Iterable<T> findAll(Sort sort);

    Page<T> findAll(Pageable pageable);

}

PagingAndSortingRepository除了CrudRepository提供的方法外還提供了分頁和排序兩種方法,TID的意思與CrudRepository相同。

 

3、擴展查詢

如果覺得curdrepository提供的查詢不符合要求,可以繼承該接口進行擴展,Spring Data JPA爲此提供了一些表達條件查詢的關鍵字,大致如下:

And--- 等價於SQL中的and 關鍵字,比如findByUsernameAndPassword(String user, Striang pwd)

Or--- 等價於SQL中的or 關鍵字,比如findByUsernameOrAddress(String user, String addr)

Between--- 等價於SQL中的between 關鍵字,比如 findBySalaryBetween(int max,int min)

LessThan--- 等價於SQL中的"<",比如 findBySalaryLessThan(int max)

GreaterThan--- 等價於SQL中的">",比如 findBySalaryGreaterThan(intmin)

IsNull--- 等價於SQL中的"is null",比如 findByUsernameIsNull()

IsNotNull--- 等價於SQL中的"is not null",比如 findByUsernameIsNotNull()

NotNull--- IsNotNull等價;

Like--- 等價於SQL中的"like",比如 findByUsernameLike(String user)

NotLike--- 等價於SQL中的"not like",比如 findByUsernameNotLike(Stringuser)

OrderBy--- 等價於SQL中的"order by",比如findByUsernameOrderBySalaryAsc(String user)

Not--- 等價於SQL中的" =",比如 findByUsernameNot(String user)

In--- 等價於SQL中的"in",比如findByUsernameIn(Collection<String> userList),方法的參數可以是 Collection類型,也可以是數組或者不定長參數;

NotIn--- 等價於SQL中的"not in",比如findByUsernameNotIn(Collection<String> userList),方法的參數可以是 Collection類型,也可以是數組或者不定長參數;

舉個例子,例子中增加了根據lastNamefirsstName查詢的方法。

public interface CustomerRepository extends CrudRepository<Customer, Long> {

   

    List<Customer> findByLastName(StringlastName);

   

    List<Customer> findByFirstName(String firstName);  

}

4、基於@query註解的擴展

Springdata支持JPQL 語句對查詢進行擴展,例子如下:

public interface CustomerRepository extends CrudRepository<Customer, Long> {

    @Query("select a from Customer a WHERE a.firstName = ?1")

    List<Customer> findByQuery(StringfirstName);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章