附上示例程序的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 CrudRepositoryextends Serializable>extends Repository { extends T> S save(Sentity); extends T> Iterable save(Iterableentities); T findOne(ID id); boolean exists(IDid); Iterable findAll(); Iterable findAll(Iterable ids); long count(); void delete(IDid); void delete(Tentity); void delete(Iterableextends T> entities); void deleteAll(); } |
CrudRepository接口实现了save、delete、count、exists、findOne等方法,方法的意思从名字上很容易理解,继承这个接口时需要两个模板参数T和ID,T就是你的实体类(对应数据库表),ID就是主键。
在使用中,用户需要继承这个接口,Customer就是定义的实体,Long是主键类型
public interface CustomerRepository extends CrudRepository |
2、PagingAndSortingRepository
public interface PagingAndSortingRepositoryextends Serializable> extends CrudRepository { Iterable findAll(Sort sort); Page 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中的"<"&#xff0c;比如 findBySalaryLessThan(int max)&#xff1b;
GreaterThan--- 等价于SQL中的">"&#xff0c;比如 findBySalaryGreaterThan(intmin)&#xff1b;
IsNull--- 等价于SQL中的"is null"&#xff0c;比如 findByUsernameIsNull()&#xff1b;
IsNotNull--- 等价于SQL中的"is not null"&#xff0c;比如 findByUsernameIsNotNull()&#xff1b;
NotNull--- 与IsNotNull等价&#xff1b;
Like--- 等价于SQL中的"like"&#xff0c;比如 findByUsernameLike(String user)&#xff1b;
NotLike--- 等价于SQL中的"not like"&#xff0c;比如 findByUsernameNotLike(Stringuser)&#xff1b;
OrderBy--- 等价于SQL中的"order by"&#xff0c;比如findByUsernameOrderBySalaryAsc(String user)&#xff1b;
Not--- 等价于SQL中的"&#xff01; &#61;"&#xff0c;比如 findByUsernameNot(String user)&#xff1b;
In--- 等价于SQL中的"in"&#xff0c;比如findByUsernameIn(Collection userList)&#xff0c;方法的参数可以是 Collection类型&#xff0c;也可以是数组或者不定长参数&#xff1b;
NotIn--- 等价于SQL中的"not in"&#xff0c;比如findByUsernameNotIn(Collection userList)&#xff0c;方法的参数可以是 Collection类型&#xff0c;也可以是数组或者不定长参数&#xff1b;
举个例子&#xff0c;例子中增加了根据lastName和firsstName查询的方法。
public interface CustomerRepository extends CrudRepository { List findByLastName(StringlastName); List findByFirstName(String firstName); } |
4、基于&#64;query注解的扩展
Springdata支持JPQL 语句对查询进行扩展&#xff0c;例子如下&#xff1a;
public interface CustomerRepository extends CrudRepository { &#64;Query("select a from Customer a WHERE a.firstName &#61; ?1") List findByQuery(StringfirstName); } |