这章讲使用者最关心的数据层。
JPA有一个十分重要的接口:Repository,这个接口不含任何内容,仅仅是一个标识接口,但他是我们JPA查询的起点,我们可以继承该接口来实现特定的Repository,但是这里spring-data-jpa也帮助我们进行了简化,提供了层次和能力非常明确的几个子接口。
CrudRepository
<S extends T> S save(S var1);
<S extends T> Iterable<S> save(Iterable<S> var1);
T findOne(ID var1);
boolean exists(ID var1);
Iterable<T> findAll();
Iterable<T> findAll(Iterable<ID> var1);
long count();
void delete(ID var1);
void delete(T var1);
void delete(Iterable<? extends T> var1);
void deleteAll();
CrudRepository接口提供了最基本的增删改查能力,从各个方法的命名就很容易猜出用途。
PagingAndSortingRepository
Iterable<T> findAll(Sort var1);
Page<T> findAll(Pageable var1);
PagingAndSortingRepository继承自CrudRepository接口,提供排序以及分页查询能力。这里需要讲一下Sort和Pageable类,非常重要,在查询中经常会用到(貌似也就这两个了)。
Sort主要为了实现排序功能,内部有个枚举类指示排序方式:
public static enum Direction {
ASC,
DESC;
//省略方法
}
然后利用最常用的构造函数,就能申明我们排序的意图
public Sort(Sort.Direction direction, String... properties) {
this(direction, (List)(properties == null?new ArrayList():Arrays.asList(properties)));
}
建立一个Sort
Sort sort = new Sort(Direction.DESC, "id");
意图就一眼便知了。
然后是Pageable类,用于申明我们分页意图,内部构造如下:
int getPageNumber();
int getPageSize();
int getOffset();
Sort getSort();
Pageable next();
Pageable previousOrFirst();
Pageable first();
boolean hasPrevious();
它的重要实现是PageRequest类(单独一章会讲分页),提供三个构造方法:
public PageRequest(int page, int size) {
this(page, size, (Sort)null);
}
public PageRequest(int page, int size, Direction direction, String... properties) {
this(page, size, new Sort(direction, properties));
}
public PageRequest(int page, int size, Sort sort) {
super(page, size);
this.sort = sort;
}
都十分好理解,第二个中Direction也就是Sort中的内部枚举。
构建好Sort,Pageable参数,就能实现PagingAndSortingRepository接口提供的排序与分页能力。
JpaRepository
首先看内部分方法:
List<T> findAll();
List<T> findAll(Sort var1);
List<T> findAll(Iterable<ID> var1);
<S extends T> List<S> save(Iterable<S> var1);
void flush();
<S extends T> S saveAndFlush(S var1);
void deleteInBatch(Iterable<T> var1);
void deleteAllInBatch();
T getOne(ID var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
该接口提供批处理能力,优化CrudRepository接口部分功能的同时,提供了批量新增等功能。
开发中,我们通常直接继承JpaRepository接口,指向我们的实体类以及主键类型,就能完成一个提供基本,但是已经满足大部分情况操作使用的Repository接口了
public interface StudentDao extends JpaRepository<Student, Long> {
}
接口中无需任何实现,可以直接使用被继承接口的方法,当然,我们需要增强这个StudentDao接口的能力也是非常简单的,下章会单独讲使用该接口进行查询操作。
网友评论