附上示例程序的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中最核心的概念就是Repository,Repository是一個抽象的接口,用戶通過該接口來實現數據的訪問。這次的內容基於Spring Data JPA進行介紹,Spring Data JPA提供了關係型數據庫訪問的一致性,在該組件中,Repository包括CrudRepository和PagingAndSortingRepository兩類。
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接口實現了save、delete、count、exists、findOne等方法,方法的意思從名字上很容易理解,繼承這個接口時需要兩個模板參數T和ID,T就是你的實體類(對應數據庫表),ID就是主鍵。
在使用中,用戶需要繼承這個接口,Customer就是定義的實體,Long是主鍵類型
public interface CustomerRepository extends CrudRepository<Customer, Long> |
2、PagingAndSortingRepository
public interface PagingAndSortingRepository<T, IDextends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); } |
PagingAndSortingRepository除了CrudRepository提供的方法外還提供了分頁和排序兩種方法,T和ID的意思與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類型,也可以是數組或者不定長參數;
舉個例子,例子中增加了根據lastName和firsstName查詢的方法。
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); } |