**1. 常用接口继承关系**
:-: 
常用的两个接口是JpaRepository和JpaSpecificationExecutor。只要让我们的接口继承这两个接口,就可以调用这两个接口的一些方法与数据库做CURD操作。但是这些方法都只是声明并没有实现,那么在Spring Data JPA中这些方法是如何实现的?
<br/>
**2. JDK动态代理实现**
其实这些接口方法的实现是通过JDK动态代理来实现的。
下面简单演示一下其实现过程。
(1)通过 JdkDynamicAopProxy 动态代理生成接口 UserRepository 的一个代理对象SimpleJpaRepository。

(2)通过查看 SimpleJpaRepository 的源码可以看到有函数`findOne`。

(3)`findOne`函数调用了`this.getQuery(..)`函数,定位到该函数可以发现有一个变量`this.em`。

(4)而这个`this.em`变量就是接口 EntityManager。

(5)这个 EntityManager 就是JPA原生的实现方式。

所以我们得到结论Spring Data JPA只是对标准JPA操作进行了进一步封装,简化了Dao层代码的开发。
<br/>
**3. Spring Data JPA的调用过程**
:-: 
- MapStruct属性映射
- MapStruct是什么
- maven依赖
- 基本映射
- 字段名不一致的映射
- 字段类型不一致的映射
- 基本数据类型转换
- 日期格式转换
- 使用表达式转换
- 枚举映射
- 多个源类的映射
- 集合的映射
- 添加自定义映射方法
- 映射前后
- 添加默认值
- 映射异常处理
- SpringDataJPA
- SpringDataJPA是什么
- 与JPA、Hibernate的关系
- 环境搭建
- 简单CURD操作
- 内部原理
- 主键生成策略
- 联合主键
- 查询方式
- 方法命名规则查询
- 限制查询结果查询
- 注解@Query查询
- 命名参数查询
- SpEL表达式查询
- 原生查询
- 更新与删除
- Specification动态查询
- 核心接口
- 查询例子
- 分页查询与排序
- 多表查询
- 一对一查询
- 一对多查询
- 多对多查询
- 注意事项
- Specification多表查询
- @Query多表查询
- 只查询指定字段
- 级联操作
- 加载规则