愉快的使用JPA进行数据查询(三)数据层

这章讲使用者最关心的数据层。
JPA有一个十分重要的接口:Repository,这个接口不含任何内容,仅仅是一个标识接口,但他是我们JPA查询的起点,我们可以继承该接口来实现特定的Repository,但是这里spring-data-jpa也帮助我们进行了简化,提供了层次和能力非常明确的几个子接口。

愉快的使用JPA进行数据查询(三)数据层_第1张图片
image.png

CrudRepository

   S save(S var1);

   Iterable save(Iterable var1);

  T findOne(ID var1);

  boolean exists(ID var1);

  Iterable findAll();

  Iterable findAll(Iterable var1);

  long count();

  void delete(ID var1);

  void delete(T var1);

  void delete(Iterable var1);

  void deleteAll();

CrudRepository接口提供了最基本的增删改查能力,从各个方法的命名就很容易猜出用途。

PagingAndSortingRepository

  Iterable findAll(Sort var1);

  Page 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 findAll();

  List findAll(Sort var1);

  List findAll(Iterable var1);

   List save(Iterable var1);

  void flush();

   S saveAndFlush(S var1);

  void deleteInBatch(Iterable var1);

  void deleteAllInBatch();

  T getOne(ID var1);

   List findAll(Example var1);

   List findAll(Example var1, Sort var2);

该接口提供批处理能力,优化CrudRepository接口部分功能的同时,提供了批量新增等功能。

开发中,我们通常直接继承JpaRepository接口,指向我们的实体类以及主键类型,就能完成一个提供基本,但是已经满足大部分情况操作使用的Repository接口了

public interface StudentDao extends JpaRepository {
}

接口中无需任何实现,可以直接使用被继承接口的方法,当然,我们需要增强这个StudentDao接口的能力也是非常简单的,下章会单独讲使用该接口进行查询操作。


欢迎关注公众号交流,定期分享源码心得


愉快的使用JPA进行数据查询(三)数据层_第2张图片
image.png

你可能感兴趣的:(愉快的使用JPA进行数据查询(三)数据层)