附上示例程序的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); } |