Mybatis源碼剖析 -- 架構(gòu)原理

一忍捡、架構(gòu)設(shè)計

Mybatis 的功能架構(gòu)分為三層

  1. API 接口層
    提供給外部使用的接口 API,開發(fā)人員通過這些本地 API 來操作數(shù)據(jù)庫竖幔。接口層?接收
    到調(diào)用請求就會調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理
    MyBatis 和數(shù)據(jù)庫的交互有兩種方式
    • 使用傳統(tǒng)的 MyBatis 提供的API
    • 使用 Mapper 代理的方式
  2. 數(shù)據(jù)處理層
    負(fù)責(zé)具體的 SQL查找板乙、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請求完成?次數(shù)據(jù)庫操作
  3. 基礎(chǔ)支撐層
    負(fù)責(zé)最基礎(chǔ)的功能支撐募逞,包括連接管理蛋铆、事務(wù)管理、配置加載和緩存處理放接,這些都是
    共用的東西刺啦,將他們抽取出來作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐


二纠脾、主要構(gòu)件及其相互關(guān)系

構(gòu)件 描述
SqlSession 作為 MyBatis 工作的主要頂層API玛瘸,表示和數(shù)據(jù)庫交互的會話,完成必要數(shù)據(jù)庫增刪改查功能
Executor MyBatis執(zhí)行器苟蹈,是 MyBatis 調(diào)度的核心糊渊,負(fù)責(zé)SQL語句的生成和查詢緩存的維護(hù)
StatementHandler 封裝了 JDBC Statement 操作,負(fù)責(zé)對 JDBC statement 的操作汉操,如設(shè)置參數(shù)再来、將 Statement 結(jié)果集轉(zhuǎn)換成 List 集合
ParameterHandler 負(fù)責(zé)對用戶傳遞的參數(shù)轉(zhuǎn)換成 JDBC Statement 所需要的參數(shù)
ResultSetHandler 負(fù)責(zé)將 JDBC 返回的 ResultSet 結(jié)果集對象轉(zhuǎn)換成 List 類型的集合
TypeHandler 負(fù)責(zé) java 數(shù)據(jù)類型和 JDBC 數(shù)據(jù)類型之間的映射和轉(zhuǎn)換
MappedStatement MappedStatement 維護(hù)了?條<select | update | delete | insert>節(jié)點的封裝
SqlSource 負(fù)責(zé)根據(jù)用戶傳遞的 parameterObject,動態(tài)地生成SQL語句磷瘤,將信息封裝到 BoundSql 對象中芒篷,并返回
BoundSql 表示動態(tài)生成的SQL語句以及相應(yīng)的參數(shù)信息

三、總體流程

  1. 加載配置并初始化采缚,將核心配置文件內(nèi)容解析封裝到 Configuration针炉,將 SQL 的配置信息加載成為?個 mappedStatement 對象,存儲在內(nèi)存之中
    • 觸發(fā)條件:加載配文件
    • 配置來源于兩個地方:
      ① 配置文件(核心配置文件conf.xml扳抽,mapper文件*.xml)
      ② java 代碼中的注解
  2. 接收調(diào)用請求
    • 觸發(fā)條件:調(diào)用 Mybatis 提供的API
    • 傳入?yún)?shù):為 SQL 的 ID 和傳入?yún)?shù)對象
    • 處理過程:將請求傳遞給下層的請求處理層進(jìn)行處理
  3. 處理操作請求
    • 觸發(fā)條件:API接口層傳遞請求過來
    • 傳入?yún)?shù):為 SQL 的 ID 和傳入?yún)?shù)對象
    • 處理過程:
      ① 根據(jù) SQL 的 ID 查找對應(yīng)的 MappedStatement 對象
      ② 根據(jù)傳入?yún)?shù)對象解析 MappedStatement 對象篡帕,得到最終要執(zhí)行的 SQL 和執(zhí)行傳入?yún)?shù)
      ③ 獲取數(shù)據(jù)庫連接,根據(jù)得到的最終 SQL 語句和執(zhí)行傳入?yún)?shù)到數(shù)據(jù)庫執(zhí)行贸呢,并得到執(zhí)行結(jié)果
      ④ 根據(jù) MappedStatement 對象中的結(jié)果映射配置對得到的執(zhí)行結(jié)果進(jìn)行轉(zhuǎn)換處理镰烧,并得到最終的處理結(jié)果
      ⑤ 釋放連接資源
  4. 返回處理結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市楞陷,隨后出現(xiàn)的幾起案子怔鳖,更是在濱河造成了極大的恐慌,老刑警劉巖固蛾,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件结执,死亡現(xiàn)場離奇詭異,居然都是意外死亡艾凯,警方通過查閱死者的電腦和手機(jī)献幔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趾诗,“玉大人蜡感,你說我怎么就攤上這事。” “怎么了铸敏?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵缚忧,是天一觀的道長。 經(jīng)常有香客問我杈笔,道長闪水,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任蒙具,我火速辦了婚禮球榆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禁筏。我一直安慰自己持钉,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布篱昔。 她就那樣靜靜地躺著每强,像睡著了一般。 火紅的嫁衣襯著肌膚如雪州刽。 梳的紋絲不亂的頭發(fā)上空执,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音穗椅,去河邊找鬼辨绊。 笑死,一個胖子當(dāng)著我的面吹牛匹表,可吹牛的內(nèi)容都是我干的门坷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼袍镀,長吁一口氣:“原來是場噩夢啊……” “哼默蚌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起苇羡,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤敏簿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宣虾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡温数,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年绣硝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撑刺。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹉胖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甫菠,我是刑警寧澤挠铲,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站寂诱,受9級特大地震影響拂苹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痰洒,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一瓢棒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丘喻,春花似錦脯宿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至嗡靡,卻和暖如春跺撼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叽躯。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工财边, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人点骑。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓酣难,卻偏偏與公主長得像,于是被迫代替她去往敵國和親黑滴。 傳聞我的和親對象是個殘疾皇子憨募,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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