**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多表查詢
- 只查詢指定字段
- 級聯操作
- 加載規則