前言
本章讲解SpringData JPA接口继承结构及原理分析
方法
1.回顾
我们回顾一下上个章节中我们对dao层接口的编写方式:
我们直接继承了一个名字为JpaRepository的接口,那么这个接口有什么名堂呢?这将是下面分析的重点。
2.接口继承结构
我们来看一下JpaRepository接口的结构,它将从父接口继承的方法做了返回值的适配工作:
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>
再看一下它的结构继承结构:
我们首先来看一下Repository接口,该接口下没有任何的方法,只是起到了标识的作用,和JDK中的Serializable类似
public interface Repository<T, ID>
接下来,我们观察一下其子接口CrudRepository,它提供了对数据库的CRUD操作
public interface CrudRepository<T, ID> extends Repository<T, ID>
然后看一下PagingAndSortingRepository接口,它提供了相关的分页和排序功能:
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID>
说了这么多,不知道大家有没有仔细的观察,上面列举的方法在查询上几乎都是查询全部!!!
如果说我们需要细粒度更小的查询呢?那么上面的findAll将无能为力!
为了解决这个问题,我们的JpaRepository接口还继承了另外一个接口,那就是QueryByExampleExecutor<T>接口,该接口可以增强我们JpaRepository接口的查询能力,丰富了查询功能!
3.JpaRepository底层运行原理
不知道大家有没有想过这样一个问题:
我的UserDAO直接继承了JpaRepository接口,那么我没有写实现类啊!那我调用方法总不可能实例化接口吧!
显然,其肯定是有实现类的哦!
观察JpaRepository接口实现类:
显然,我们这个SimpleJpaRepository类正是我们想要的实现类。
我们通过代码进一步证实一下:
经过测试,我们的UserDAO接口注入的实现类确实为SimpleJpaRepository。