透徹理解MyBatis設(shè)計(jì)思想之手寫實(shí)現(xiàn)

前言

MyBatis出嘹,曾經(jīng)給我的感覺(jué)是一個(gè)很神奇的東西焚辅,我們只需要按照規(guī)范寫好XXXMapper.xml以及XXXMapper.java接口。要知道我們并沒(méi)有提供XXXMapper.java的實(shí)現(xiàn)類,MyBatis到底是怎么做到這一點(diǎn)的呢慎陵?有人會(huì)說(shuō)是動(dòng)態(tài)代理仲闽,現(xiàn)在我就來(lái)通過(guò)手寫一個(gè)迷你版的MyBatis來(lái)徹底理解它的設(shè)計(jì)思想脑溢!

如果你不了解JDK動(dòng)態(tài)代理,請(qǐng)參考:《純手寫實(shí)現(xiàn)JDK動(dòng)態(tài)代理》

如果你不了解MyBatis的使用赖欣,請(qǐng)參考:《MyBatis+Spring MVC開(kāi)發(fā)指南(一)》

如果你對(duì)Spring MVC感興趣屑彻,請(qǐng)參考:《寫出我的第一個(gè)框架:迷你版Spring MVC》


動(dòng)手寫一個(gè)迷你版的MyBatis

MyBatis原理架構(gòu)圖

其實(shí)對(duì)于MyBatis最為關(guān)鍵的就在于:

XXXMapper mapper = sqlSession.getMapper(XXXMapper.class);

大家可以以這個(gè)為切入口,進(jìn)行源碼跟蹤顶吮,容易得到上面的調(diào)用鏈社牲。

我們先來(lái)看一下迷你版MyBatis的整體框架思路:

迷你版MyBatis

執(zhí)行器MyExecutor:

MyExecutor提供query方法

在MyBatis中,比如說(shuō)select有多種形式悴了,比如selectOne,selectList搏恤,那么其實(shí)到最后,還是向JDBC發(fā)出一個(gè)SQL而已湃交。對(duì)于執(zhí)行器而言熟空,其實(shí)對(duì)于查詢,提供一個(gè)query接口就可以了巡揍。

這里痛阻,為了簡(jiǎn)便,直接執(zhí)行已經(jīng)處理好的SQL語(yǔ)句(動(dòng)態(tài)SQL以及輸入類型腮敌,這不是迷你版MyBatis關(guān)心的)阱当。另外執(zhí)行器的實(shí)現(xiàn)類MyBaseExecutor其實(shí)就是一段JDBC的操作代碼。


query的JDBC實(shí)現(xiàn)

這里為了簡(jiǎn)化處理糜工,在RequestMapping這塊硬編碼了弊添。

StudentMapper.java/StudentMapper.xml:

Mapper接口


Mapper.xml

這里,為了不牽涉到XML的解析過(guò)程捌木,直接提供已經(jīng)處理完畢的結(jié)果油坝。其實(shí)就是namespace/statementID/SQL的存儲(chǔ)、映射。

對(duì)外暴露的API接口(MySqlSession):

MySqlSession


MySqlSession實(shí)現(xiàn)

從這里澈圈,你能夠看到一些端倪:

第一彬檀,MyDefaultSqlSession持有執(zhí)行器的引用,調(diào)用selectOne等方法瞬女,就是在調(diào)用執(zhí)行器的query方法窍帝。

第二,在getMapper的獲取過(guò)程中诽偷,我們看到了具體業(yè)務(wù)處理Handler的身影:MyMapperProxy坤学,根據(jù)JDK動(dòng)態(tài)代理的知識(shí),我們知道报慕,最終都是要回調(diào)Handler的invoke方法完成的深浮。

MyMapperProxy:

MyMapperProxy

當(dāng)invoke方法被調(diào)用時(shí),我們根據(jù)調(diào)用的方法眠冈,進(jìn)行反射飞苇,得到namespace以及對(duì)應(yīng)的SQL,然后洋闽,我們把SQL交給sqlSession進(jìn)行執(zhí)行即可玄柠。

啟動(dòng)測(cè)試類Bootstrap:

Bootstrap

看到?jīng)]有,我們完全通過(guò)自己的類诫舅,自己的理解羽利,去實(shí)現(xiàn)了和MyBatis一樣的功能!


OK刊懈,一個(gè)迷你版的MyBatis就竣工了这弧,有一種油然而生的成就感,哈哈~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虚汛,一起剝皮案震驚了整個(gè)濱河市匾浪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卷哩,老刑警劉巖蛋辈,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異将谊,居然都是意外死亡冷溶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門尊浓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)逞频,“玉大人,你說(shuō)我怎么就攤上這事栋齿∶缯停” “怎么了襟诸?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)基协。 經(jīng)常有香客問(wèn)我歌亲,道長(zhǎng),這世上最難降的妖魔是什么堡掏? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任应结,我火速辦了婚禮刨疼,結(jié)果婚禮上泉唁,老公的妹妹穿的比我還像新娘。我一直安慰自己揩慕,他們只是感情好亭畜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著迎卤,像睡著了一般拴鸵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蜗搔,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天劲藐,我揣著相機(jī)與錄音,去河邊找鬼樟凄。 笑死聘芜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缝龄。 我是一名探鬼主播汰现,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叔壤!你這毒婦竟也來(lái)了瞎饲?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炼绘,失蹤者是張志新(化名)和其女友劉穎嗅战,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體俺亮,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驮捍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铅辞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厌漂。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斟珊,靈堂內(nèi)的尸體忽然破棺而出苇倡,到底是詐尸還是另有隱情富纸,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布旨椒,位于F島的核電站晓褪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏综慎。R本人自食惡果不足惜涣仿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望示惊。 院中可真熱鬧好港,春花似錦、人聲如沸米罚。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)录择。三九已至拔莱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隘竭,已是汗流浹背塘秦。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留动看,地道東北人尊剔。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像弧圆,于是被迫代替她去往敵國(guó)和親赋兵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,804評(píng)論 6 342
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 搔预? MyBatis 是支持定制化 SQL霹期、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,511評(píng)論 0 4
  • Mybatis相關(guān) 1.Mybatis是什么? 2.為什么選擇Mybatis? 3、#{}和${}的區(qū)別是什么拯田? ...
    zhihaoZzz閱讀 1,282評(píng)論 0 2
  • 隨著人們生活水平的提高,越來(lái)越多的人開(kāi)始關(guān)注口腔健康历造。牙齒健康關(guān)系到全身健康的諸多方面,牙齒出現(xiàn)問(wèn)題,將會(huì)對(duì)人們的...
    我只是默默無(wú)聞的小苦逼閱讀 493評(píng)論 0 0
  • 一、情境綜述 工作:重點(diǎn)圍繞R項(xiàng)目及質(zhì)量問(wèn)題攻關(guān)開(kāi)展工作船庇。 素質(zhì):周計(jì)劃實(shí)踐進(jìn)入第3階段吭产,加強(qiáng)跟進(jìn);日計(jì)劃記錄持續(xù)...
    嚴(yán)哥閱讀 285評(píng)論 0 1