MP 启动注入 SQL 原理分析
生活随笔
收集整理的這篇文章主要介紹了
MP 启动注入 SQL 原理分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
MP 啟動(dòng)注入 SQL 原理分析
文章目錄
- 一、MybatisPlus需要sql語句嗎?
- 解答:需要
- 1.1. 問題:為什么MybatisPlus看不到sql語句?
- 1.2. 分析:繼承關(guān)系
- 1.3. 假設(shè):操作數(shù)據(jù)庫一定有sql
- 二、通過現(xiàn)象看本質(zhì)
- 2.1. 測試案例
- 2.2. debug調(diào)試運(yùn)行
- 2.2.1. employeeMapper的本質(zhì)
- 2.2.2. MapperProxy中的對(duì)象
- 2.2.3. sqlSessionFactory中的對(duì)象
- 2.2.4. configuration對(duì)象
- 2.2.5. 方法對(duì)應(yīng)關(guān)系
- 2.2.6. MP在啟動(dòng)的時(shí)候
- 2.2.7. 當(dāng)我們調(diào)用方法的時(shí)候
- 三、源碼分析:
- 3.1. 根據(jù)方法找到類
- 3.2 斷點(diǎn)調(diào)試
- 3.3. 接著調(diào)用addDeleteMappedStatement
- 3.4. 調(diào)用injectDeleteByIdSql
- 3.5. sqlSource拼接完成
- 3.5. sqlSource拼接完成,繼續(xù)調(diào)用刪除方法
一、MybatisPlus需要sql語句嗎?
解答:需要
1.1. 問題:為什么MybatisPlus看不到sql語句?
1.2. 分析:繼承關(guān)系
- xxxMapper繼承了BaseMapper,BaseMapper提供了通用的CRUD方法,
1.3. 假設(shè):操作數(shù)據(jù)庫一定有sql
- 方法來源于BaseMapper,有方法就必須有SQL,因?yàn)镸ybatis最終還是需要通過SQL語句里操作數(shù)據(jù)庫。
二、通過現(xiàn)象看本質(zhì)
2.1. 測試案例
@Testpublic void testCommonSelect() {//1. 根據(jù)主鍵ID查詢Integer idPK = 1;Employee employee = employeeMapper.selectById(idPK);System.out.println(employee);}2.2. debug調(diào)試運(yùn)行
employeeMapper就是一個(gè)接口,但是我們拿到的對(duì)象是一個(gè)代理對(duì)象,這個(gè)JDK動(dòng)態(tài)代理
2.2.1. employeeMapper的本質(zhì)
- 就是org.apache.ibatis.binding.MapperProxy@4362d7df
2.2.2. MapperProxy中的對(duì)象
- MapperProxy中sqlSeaaion有一個(gè)sqlSessionFactory
2.2.3. sqlSessionFactory中的對(duì)象
- 在sqlSessionFactory中有一個(gè)重要的對(duì)象configuration
2.2.4. configuration對(duì)象
- 這個(gè)對(duì)象是mybatis的全局配置對(duì)象,它包含了所有的配置信息。
- 在configuration里面有一個(gè)mappendStatements對(duì)象,它里面每一個(gè)都是一個(gè)mappendStatement
其實(shí),每一個(gè)都是一個(gè)mapperdStatement都表示Mapper接口的一個(gè)方法與Mapper映射文件中的一個(gè)sql語句。
2.2.5. 方法對(duì)應(yīng)關(guān)系
- 在BaseMapper定義的每一個(gè)方法,都會(huì)有一條sql語句與之對(duì)應(yīng)mapperdStatement。
2.2.6. MP在啟動(dòng)的時(shí)候
- 就會(huì)分析已經(jīng)把我們BaseMapper里面的每一個(gè)方法,,將來索要執(zhí)行的sql語句,都幫我們構(gòu)造好了,并且都幫我們都保存到了configuraion里面的MappedStatements中的MappedStatement了。
2.2.7. 當(dāng)我們調(diào)用方法的時(shí)候
- 它就會(huì)回到configuration里面找到我們的MappedStatements,然后根據(jù)調(diào)用方法的名字,再去找到對(duì)應(yīng)的sql語句,在其執(zhí)行。
本質(zhì)
在控制臺(tái),在實(shí)例化employeeMapper這個(gè)bean的時(shí)候,都調(diào)用了addMappedStatement這個(gè)方法,來添加一個(gè)addMappedStatement,而每一個(gè)addMappedStatement對(duì)應(yīng)著mapper文件中的每一個(gè)方法
三、源碼分析:
3.1. 根據(jù)方法找到類
根據(jù)addMappedStatement,找到此方法的類AutoSqlInjector SQL 自動(dòng)注入器,
這個(gè)java文件
這個(gè).class文件
3.2 斷點(diǎn)調(diào)試
- 在.class文件中的addMappedStatement方法上打斷點(diǎn),dubug運(yùn)行,當(dāng)F8走到此方時(shí),參數(shù)包括sqlSource 等都是前面?zhèn)鬟^來的,因此,我們需要往前推
3.3. 接著調(diào)用addDeleteMappedStatement
3.4. 調(diào)用injectDeleteByIdSql
3.5. sqlSource拼接完成
3.5. sqlSource拼接完成,繼續(xù)調(diào)用刪除方法
- 接下來就去調(diào)用addDeleteMappedStatement進(jìn)行具體操作
總結(jié)
以上是生活随笔為你收集整理的MP 启动注入 SQL 原理分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS 7 安装版本管理 GitL
- 下一篇: Spring中,使用工具类无法自动注入s