美文网首页框架学习jpa
愉快的使用JPA进行数据查询(三)数据层

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

作者: 猪的尾巴 | 来源:发表于2017-07-10 23:22 被阅读707次

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

    image.png

    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接口的能力也是非常简单的,下章会单独讲使用该接口进行查询操作。

    相关文章

      网友评论

        本文标题:愉快的使用JPA进行数据查询(三)数据层

        本文链接:https://www.haomeiwen.com/subject/fjouhxtx.html