**1. 常用接口继承关系**
:-: ![](https://img.kancloud.cn/40/af/40af28b1f89f701381f5807ed960aa3b_600x547.png)
常用的两个接口是JpaRepository和JpaSpecificationExecutor。只要让我们的接口继承这两个接口,就可以调用这两个接口的一些方法与数据库做CURD操作。但是这些方法都只是声明并没有实现,那么在Spring Data JPA中这些方法是如何实现的?
<br/>
**2. JDK动态代理实现**
其实这些接口方法的实现是通过JDK动态代理来实现的。
下面简单演示一下其实现过程。
(1)通过 JdkDynamicAopProxy 动态代理生成接口 UserRepository 的一个代理对象SimpleJpaRepository。
![](https://img.kancloud.cn/64/08/6408544cf258943d4523576b95a988e2_1467x480.png)
(2)通过查看 SimpleJpaRepository 的源码可以看到有函数`findOne`。
![](https://img.kancloud.cn/90/a9/90a972eeb636957d24856496c032cbae_1244x210.png)
(3)`findOne`函数调用了`this.getQuery(..)`函数,定位到该函数可以发现有一个变量`this.em`。
![](https://img.kancloud.cn/3f/a8/3fa8bce098b633b7faebfa69327b6f08_1243x235.png)
(4)而这个`this.em`变量就是接口 EntityManager。
![](https://img.kancloud.cn/c1/b6/c1b6e8c0c7342d24428df631b22c6cdb_1246x202.png)
(5)这个 EntityManager 就是JPA原生的实现方式。
![](https://img.kancloud.cn/fd/15/fd1567d8490ddbbf7497e238df09131c_1289x229.png)
所以我们得到结论Spring Data JPA只是对标准JPA操作进行了进一步封装,简化了Dao层代码的开发。
<br/>
**3. Spring Data JPA的调用过程**
:-: ![](https://img.kancloud.cn/c0/18/c018c07aad11044ccec081cbcb7fffde_230x458.png)
- MapStruct属性映射
- MapStruct是什么
- maven依赖
- 基本映射
- 字段名不一致的映射
- 字段类型不一致的映射
- 基本数据类型转换
- 日期格式转换
- 使用表达式转换
- 枚举映射
- 多个源类的映射
- 集合的映射
- 添加自定义映射方法
- 映射前后
- 添加默认值
- 映射异常处理
- SpringDataJPA
- SpringDataJPA是什么
- 与JPA、Hibernate的关系
- 环境搭建
- 简单CURD操作
- 内部原理
- 主键生成策略
- 联合主键
- 查询方式
- 方法命名规则查询
- 限制查询结果查询
- 注解@Query查询
- 命名参数查询
- SpEL表达式查询
- 原生查询
- 更新与删除
- Specification动态查询
- 核心接口
- 查询例子
- 分页查询与排序
- 多表查询
- 一对一查询
- 一对多查询
- 多对多查询
- 注意事项
- Specification多表查询
- @Query多表查询
- 只查询指定字段
- 级联操作
- 加载规则