mybatis源碼之參數(shù)解析及結(jié)果映射執(zhí)行過程

1阅嘶、mybatis執(zhí)行入口

前一篇已經(jīng)分析過SqlSession內(nèi)的getMapper方法萝衩,最終是通過configuration生成了MapperProxy代理類。所有mapper的如果其實(shí)是通過MapperProxy代理執(zhí)行俱两,代碼如下

args參數(shù)為mapper方法執(zhí)行調(diào)用的參數(shù)


image.png

實(shí)際執(zhí)行者為MapperMethod類的execute赎线,此文主要分析select執(zhí)行過程


image.png

上圖紅框的內(nèi)容第一處為參數(shù)的初步解析,我們看下源碼處理钥弯,實(shí)際是通過ParamNameResolver進(jìn)行初步的映射關(guān)系存儲(chǔ)径荔,names存儲(chǔ)參數(shù)名的順利映射,參數(shù)名若有注解Param則為注解內(nèi)的參數(shù)名脆霎,否者參數(shù)名為方法內(nèi)的參數(shù)名总处。
getNamedParams方法則將mapper調(diào)用的參數(shù)和names內(nèi)的參數(shù)映射,方法如下


image.png

image.png

image.png

初步參數(shù)解析成為一個(gè)map將存儲(chǔ)參數(shù)名和實(shí)際值的映射

二睛蛛、參數(shù)解析執(zhí)行過程

實(shí)際核心執(zhí)行者為Executor

image.png

image.png

我們看看BaseExecutor對(duì)于query的實(shí)現(xiàn)鹦马,隱約可以看到緩存的痕跡此處不分析,圖中可以看出BoundSql是由MappedStatement獲取的下面分析生成過程


image.png

BoundSql為sql的詳細(xì)信息忆肾,參數(shù)解析則存在未生成BoundSql的方法內(nèi)荸频,先看看BoundSql的信息下圖可以看出,內(nèi)部有sql信息及詳細(xì)映射信息


image.png

核心生成過程是有sqlSource實(shí)現(xiàn)
image.png

sqlSource相關(guān)的子類信息客冈,主要分析DynamicSqlSource


image.png

主要解析由SqlSourceBuilder實(shí)現(xiàn)
image.png

SqlSourceBuilder源碼
image.png

由GenericTokenParser類處理#{}內(nèi)部的參數(shù)旭从,將sql語句內(nèi)的#{}替換成問號(hào),并且生成
相應(yīng)的ParameterMapping對(duì)象,ParameterMapping內(nèi)容如下
image.png

expression為#{}內(nèi)的內(nèi)容和悦,closeToken為‘}’退疫,openToken為‘#{’


image.png

ParameterMappingTokenHandler處理,將#{}替換成鸽素?蹄咖,然后解析語句內(nèi)容生成ParameterMapping對(duì)象放入parameterMappings中

到此BoundSql的解析過程基本結(jié)束。

回到BaseExecutor查看執(zhí)行過程付鹿,先判斷有沒有緩存有緩存直接返回內(nèi)容澜汤,沒有緩存則執(zhí)行數(shù)據(jù)庫查詢操作


最終的執(zhí)行者為StatementHandler


image.png

看看SimpleStatementHandler的具體實(shí)現(xiàn),由Statement實(shí)行boundSql內(nèi)的sql舵匾,下圖可以看出結(jié)果的映射是由ResultSetHandler處理


image.png

Statement的參數(shù)化則在BaseExecutor內(nèi)
image.png

參數(shù)化的詳細(xì)過程主要在DefaultParameterHandler內(nèi)的setParameters下面看源碼俊抵,主要是根據(jù)前期解析出來的ParameterMapping集合,從boundSql內(nèi)取參數(shù)賦值坐梯,沒有的話根據(jù)parameterObject是否有處理類判斷賦值


image.png

三徽诲、結(jié)果映射執(zhí)行過程

ResultSetHandler接口處理


image.png

結(jié)果的主要由DefaultResultSetHandler類處理,該類的mappedStatement及其先關(guān)信息都是由Configuration生成


image.png

handleResultSet方法中resultHandler為null是使用DefaultResultHandler處理
image.png

主要看看handleRowValuesForSimpleResultMap的執(zhí)行過程


image.png

rowValue為處理后映射的結(jié)果對(duì)象吵血,我們看看getRowValue如何處理
skipRows跳過邏輯分頁如果RowBounds設(shè)置了offset則會(huì)將offset前的結(jié)果集忽略掉谎替,曾經(jīng)遇到過一次分頁插件bug就是由于分頁對(duì)象繼承RowBounds設(shè)置了offset導(dǎo)致分頁結(jié)果錯(cuò)誤
image.png

getRowValue
主要由createResultObject來創(chuàng)建結(jié)果對(duì)象
由applyAutomaticMappings和applyPropertyMappings來完成對(duì)象和結(jié)果集的映射
image.png

createResultObject中由ResultMap的getType方法取得結(jié)果類型生成相應(yīng)的對(duì)象


image.png

再由applyPropertyMappings方法完成對(duì)象的映射
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蹋辅,隨后出現(xiàn)的幾起案子钱贯,更是在濱河造成了極大的恐慌,老刑警劉巖侦另,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秩命,死亡現(xiàn)場離奇詭異,居然都是意外死亡褒傅,警方通過查閱死者的電腦和手機(jī)弃锐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殿托,“玉大人霹菊,你說我怎么就攤上這事≈е瘢” “怎么了旋廷?”我有些...
    開封第一講書人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長唾戚。 經(jīng)常有香客問我柳洋,道長待诅,這世上最難降的妖魔是什么叹坦? 我笑而不...
    開封第一講書人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮卑雁,結(jié)果婚禮上募书,老公的妹妹穿的比我還像新娘绪囱。我一直安慰自己,他們只是感情好莹捡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開白布鬼吵。 她就那樣靜靜地躺著,像睡著了一般篮赢。 火紅的嫁衣襯著肌膚如雪齿椅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評(píng)論 1 312
  • 那天启泣,我揣著相機(jī)與錄音涣脚,去河邊找鬼。 笑死寥茫,一個(gè)胖子當(dāng)著我的面吹牛遣蚀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播纱耻,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼芭梯,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了弄喘?” 一聲冷哼從身側(cè)響起玖喘,我...
    開封第一講書人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蘑志,沒想到半個(gè)月后芒涡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卖漫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年费尽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊始。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡旱幼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出突委,到底是詐尸還是另有隱情柏卤,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布匀油,位于F島的核電站缘缚,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敌蚜。R本人自食惡果不足惜桥滨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧齐媒,春花似錦蒲每、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至唬血,卻和暖如春望蜡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拷恨。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來泰國打工泣特, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挑随。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓状您,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兜挨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子膏孟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,417評(píng)論 8 265
  • 今年,我過了一個(gè)特別的生曰拌汇。雖然這個(gè)生日沒有蛋糕柒桑,沒有一桌好菜,沒有了爸媽的見證與陪同噪舀。但是這個(gè)生日是同學(xué)陪我渡過...
    光尚平閱讀 348評(píng)論 5 3
  • 閱讀地點(diǎn):小區(qū)滑滑梯 閱讀內(nèi)容:第二十章 開發(fā)新地域 為了保持教學(xué)的新鮮和生動(dòng)魁淳,每年都該對(duì)你的教學(xué)進(jìn)行改革,比...
    鄭一意閱讀 249評(píng)論 0 0
  • 不想戀愛, 戀愛有太多的猜疑纺座, 而我只想和你在一起…… 只想天天和你愛在一起……沒有任何猜疑 不想戀愛息拜, 戀愛有太...
    天紅Anzhenan閱讀 316評(píng)論 0 0