當(dāng)面試官問(wèn)我Mybatis初始化原理時(shí)复唤,我笑了

對(duì)于任何框架而言健田,在使用前都要進(jìn)行一系列的初始化,MyBatis也不例外佛纫。本章將通過(guò)以下幾點(diǎn)詳細(xì)介紹MyBatis的初始化過(guò)程妓局。

MyBatis的初始化做了什么

歡迎工作一到五年的Java工程師朋友們加入Java程序員開(kāi)發(fā): 854393687

群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)呈宇、高性能及分布式好爬、Jvm性能調(diào)優(yōu)、Spring源碼甥啄,MyBatis存炮,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時(shí)間來(lái)學(xué)習(xí)提升自己,不要再用"沒(méi)有時(shí)間“來(lái)掩飾自己思想上的懶惰!趁年輕穆桂,使勁拼宫盔,給未來(lái)的自己一個(gè)交代!

MyBatis基于XML配置文件創(chuàng)建Configuration對(duì)象的過(guò)程

手動(dòng)加載XML配置文件創(chuàng)建Configuration對(duì)象完成初始化享完,創(chuàng)建并使用SqlSessionFactory對(duì)象

涉及到的設(shè)計(jì)模式

一灼芭、 MyBatis的初始化做了什么

任何框架的初始化,無(wú)非是加載自己運(yùn)行時(shí)所需要的配置信息般又。MyBatis的配置信息彼绷,大概包含以下信息,其高層級(jí)結(jié)構(gòu)如下:

× configuration 配置

× properties 屬性

× settings 設(shè)置

×?typeAliases 類(lèi)型命名

×?typeHandlers 類(lèi)型處理器

×?objectFactory 對(duì)象工廠

×?plugins 插件

×?environments 環(huán)境

× environment 環(huán)境變量

×?transactionManager 事務(wù)管理器

× dataSource 數(shù)據(jù)源

×映射器

MyBatis的上述配置信息會(huì)配置在XML配置文件中倒源,那么苛预,這些信息被加載進(jìn)入MyBatis內(nèi)部,MyBatis是怎樣維護(hù)的呢笋熬?

MyBatis采用了一個(gè)非常直白和簡(jiǎn)單的方式---使用?org.apache.ibatis.session.Configuration?對(duì)象作為一個(gè)所有配置信息的容器热某,Configuration對(duì)象的組織結(jié)構(gòu)和XML配置文件的組織結(jié)構(gòu)幾乎完全一樣(當(dāng)然,Configuration對(duì)象的功能并不限于此胳螟,它還負(fù)責(zé)創(chuàng)建一些MyBatis內(nèi)部使用的對(duì)象昔馋,如Executor等,這將在后續(xù)的文章中討論)糖耸。如下圖所示:

MyBatis根據(jù)初始化好Configuration信息秘遏,這時(shí)候用戶(hù)就可以使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)操作了。

可以這么說(shuō)嘉竟,MyBatis初始化的過(guò)程邦危,就是創(chuàng)建 Configuration對(duì)象的過(guò)程。

MyBatis的初始化可以有兩種方式:

基于XML配置文件:基于XML配置文件的方式是將MyBatis的所有配置信息放在XML文件中舍扰,MyBatis通過(guò)加載并XML配置文件倦蚪,將配置文信息組裝成內(nèi)部的Configuration對(duì)象

基于Java API:這種方式不使用XML配置文件,需要MyBatis使用者在Java代碼中边苹,手動(dòng)創(chuàng)建Configuration對(duì)象陵且,然后將配置參數(shù)set 進(jìn)入Configuration對(duì)象中


(PS:? MyBatis具體配置信息有哪些,又分別表示什么意思个束,不在本文的敘述范圍慕购,讀者可以參考我的《Java Persistence withMyBatis 3 (中文版)》 的第二章 引導(dǎo)MyBatis中有詳細(xì)的描述)

接下來(lái)我們將通過(guò) 基于XML配置文件方式的MyBatis初始化,深入探討MyBatis是如何通過(guò)配置文件構(gòu)建Configuration對(duì)象茬底,并使用它的沪悲。

二、MyBatis基于XML配置文件創(chuàng)建Configuration對(duì)象的過(guò)程

現(xiàn)在就從使用MyBatis的簡(jiǎn)單例子入手阱表,深入分析一下MyBatis是怎樣完成初始化的殿如,都初始化了什么昌妹。看以下代碼:? ?

有過(guò)MyBatis使用經(jīng)驗(yàn)的讀者會(huì)知道握截,上述語(yǔ)句的作用是執(zhí)行com.foo.bean.BlogMapper.queryAllBlogInfo?定義的SQL語(yǔ)句,返回一個(gè)List結(jié)果集烂叔〗靼總的來(lái)說(shuō),上述代碼經(jīng)歷了mybatis初始化 -->創(chuàng)建SqlSession -->執(zhí)行SQL語(yǔ)句?返回結(jié)果三個(gè)過(guò)程蒜鸡。

上述代碼的功能是根據(jù)配置文件mybatis-config.xml? 配置文件胯努,創(chuàng)建SqlSessionFactory對(duì)象,然后產(chǎn)生SqlSession逢防,執(zhí)行SQL語(yǔ)句叶沛。而mybatis的初始化就發(fā)生在第三句:SqlSessionFactory?sqlSessionFactory?=?new?SqlSessionFactoryBuilder().build(inputStream);? 現(xiàn)在就讓我們看看第三句到底發(fā)生了什么。

MyBatis初始化基本過(guò)程:

SqlSessionFactoryBuilder根據(jù)傳入的數(shù)據(jù)流生成Configuration對(duì)象忘朝,然后根據(jù)Configuration對(duì)象創(chuàng)建默認(rèn)的SqlSessionFactory實(shí)例灰署。

初始化的基本過(guò)程如下序列圖所示:

由上圖所示,mybatis初始化要經(jīng)過(guò)簡(jiǎn)單的以下幾步:

1.?調(diào)用SqlSessionFactoryBuilder對(duì)象的build(inputStream)方法局嘁;

2.?SqlSessionFactoryBuilder會(huì)根據(jù)輸入流inputStream等信息創(chuàng)建XMLConfigBuilder對(duì)象;

3.?SqlSessionFactoryBuilder調(diào)用XMLConfigBuilder對(duì)象的parse()方法溉箕;

4.?XMLConfigBuilder對(duì)象返回Configuration對(duì)象;

5.?SqlSessionFactoryBuilder根據(jù)Configuration對(duì)象創(chuàng)建一個(gè)DefaultSessionFactory對(duì)象悦昵;

6.?SqlSessionFactoryBuilder返回?DefaultSessionFactory對(duì)象給Client肴茄,供Client使用。

SqlSessionFactoryBuilder相關(guān)的代碼如下所示:

上述的初始化過(guò)程中但指,涉及到了以下幾個(gè)對(duì)象:

SqlSessionFactoryBuilder : SqlSessionFactory的構(gòu)造器寡痰,用于創(chuàng)建SqlSessionFactory,采用了Builder設(shè)計(jì)模式

Configuration :該對(duì)象是mybatis-config.xml文件中所有mybatis配置信息

SqlSessionFactory:SqlSession工廠類(lèi)棋凳,以工廠形式創(chuàng)建SqlSession對(duì)象拦坠,采用了Factory工廠設(shè)計(jì)模式

XmlConfigParser :負(fù)責(zé)將mybatis-config.xml配置文件解析成Configuration對(duì)象,共SqlSessonFactoryBuilder使用贫橙,創(chuàng)建SqlSessionFactory

創(chuàng)建Configuration對(duì)象的過(guò)程

接著上述的 MyBatis初始化基本過(guò)程討論贪婉,當(dāng)SqlSessionFactoryBuilder執(zhí)行build()方法,調(diào)用了XMLConfigBuilder的parse()方法卢肃,然后返回了Configuration對(duì)象疲迂。那么parse()方法是如何處理XML文件,生成Configuration對(duì)象的呢莫湘?

1. XMLConfigBuilder會(huì)將XML配置文件的信息轉(zhuǎn)換為Document對(duì)象尤蒿,而XML配置定義文件DTD轉(zhuǎn)換成XMLMapperEntityResolver對(duì)象,然后將二者封裝到XpathParser對(duì)象中幅垮,XpathParser的作用是提供根據(jù)Xpath表達(dá)式獲取基本的DOM節(jié)點(diǎn)Node信息的操作腰池。如下圖所示:? ??

2.? 之后XMLConfigBuilder調(diào)用parse()方法:會(huì)從XPathParser中取出 <configuration>節(jié)點(diǎn)對(duì)應(yīng)的Node對(duì)象,然后解析此Node節(jié)點(diǎn)的子Node:properties, settings, typeAliases,typeHandlers, objectFactory, objectWrapperFactory, plugins, environments,databaseIdProvider, mappers

注意:在上述代碼中,還有一個(gè)非常重要的地方示弓,就是解析XML配置文件子節(jié)點(diǎn)<mappers>的方法mapperElements(root.evalNode("mappers")), 它將解析我們配置的Mapper.xml配置文件讳侨,Mapper配置文件可以說(shuō)是MyBatis的核心,MyBatis的特性和理念都體現(xiàn)在此Mapper的配置和設(shè)計(jì)上奏属,我們將在后續(xù)的文章中討論它跨跨,敬請(qǐng)期待~?

3.? 然后將這些值解析出來(lái)設(shè)置到Configuration對(duì)象中。

解析子節(jié)點(diǎn)的過(guò)程這里就不一一介紹了囱皿,用戶(hù)可以參照MyBatis源碼仔細(xì)揣摩勇婴,我們就看上述的environmentsElement(root.evalNode("environments"));?方法是如何將environments的信息解析出來(lái),設(shè)置到Configuration對(duì)象中的:

4.? 返回Configuration對(duì)象?

我們將上述的MyBatis初始化基本過(guò)程的序列圖細(xì)化嘱腥。

三耕渴、手動(dòng)加載XML配置文件創(chuàng)建Configuration對(duì)象完成初始化,創(chuàng)建并使用SqlSessionFactory對(duì)象

我們可以使用XMLConfigBuilder手動(dòng)解析XML配置文件來(lái)創(chuàng)建Configuration對(duì)象齿兔,代碼如下:

四橱脸、涉及到的設(shè)計(jì)模式

初始化的過(guò)程涉及到創(chuàng)建各種對(duì)象,所以會(huì)使用一些創(chuàng)建型的設(shè)計(jì)模式分苇。在初始化的過(guò)程中慰技,Builder模式運(yùn)用的比較多。

Builder模式應(yīng)用1: SqlSessionFactory的創(chuàng)建

對(duì)于創(chuàng)建SqlSessionFactory時(shí)组砚,會(huì)根據(jù)情況提供不同的參數(shù)吻商,其參數(shù)組合可以有以下幾種:

由于構(gòu)造時(shí)參數(shù)不定,可以為其創(chuàng)建一個(gè)構(gòu)造器Builder糟红,將SqlSessionFactory的構(gòu)建過(guò)程和表示分開(kāi):

MyBatis將SqlSessionFactoryBuilder和SqlSessionFactory相互獨(dú)立艾帐。

Builder模式應(yīng)用2: 數(shù)據(jù)庫(kù)連接環(huán)境Environment對(duì)象的創(chuàng)建

在構(gòu)建Configuration對(duì)象的過(guò)程中,XMLConfigParser解析 mybatis XML配置文件節(jié)點(diǎn)<environment>節(jié)點(diǎn)時(shí)盆偿,會(huì)有以下相應(yīng)的代碼:

在Environment內(nèi)部柒爸,定義了靜態(tài)內(nèi)部Builder類(lèi):

歡迎工作一到五年的Java工程師朋友們加入Java程序員開(kāi)發(fā): 854393687

群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用、高并發(fā)事扭、高性能及分布式捎稚、Jvm性能調(diào)優(yōu)、Spring源碼求橄,MyBatis今野,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個(gè)知識(shí)點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時(shí)間來(lái)學(xué)習(xí)提升自己,不要再用"沒(méi)有時(shí)間“來(lái)掩飾自己思想上的懶惰罐农!趁年輕条霜,使勁拼,給未來(lái)的自己一個(gè)交代涵亏!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宰睡,一起剝皮案震驚了整個(gè)濱河市蒲凶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拆内,老刑警劉巖旋圆,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異麸恍,居然都是意外死亡臂聋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)或南,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人艾君,你說(shuō)我怎么就攤上這事采够。” “怎么了冰垄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵蹬癌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我虹茶,道長(zhǎng)逝薪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任蝴罪,我火速辦了婚禮董济,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘要门。我一直安慰自己虏肾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布欢搜。 她就那樣靜靜地躺著封豪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炒瘟。 梳的紋絲不亂的頭發(fā)上吹埠,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音疮装,去河邊找鬼缘琅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛廓推,可吹牛的內(nèi)容都是我干的胯杭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼受啥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼做个!你這毒婦竟也來(lái)了鸽心?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤居暖,失蹤者是張志新(化名)和其女友劉穎顽频,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體太闺,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糯景,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了省骂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟀淮。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钞澳,靈堂內(nèi)的尸體忽然破棺而出怠惶,到底是詐尸還是另有隱情,我是刑警寧澤轧粟,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布策治,位于F島的核電站,受9級(jí)特大地震影響兰吟,放射性物質(zhì)發(fā)生泄漏通惫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一混蔼、第九天 我趴在偏房一處隱蔽的房頂上張望履腋。 院中可真熱鬧,春花似錦惭嚣、人聲如沸府树。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奄侠。三九已至,卻和暖如春载矿,著一層夾襖步出監(jiān)牢的瞬間垄潮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工闷盔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弯洗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓逢勾,卻偏偏與公主長(zhǎng)得像牡整,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溺拱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 一逃贝、 MyBatis的初始化做了什么 任何框架的初始化谣辞,無(wú)非是加載自己運(yùn)行時(shí)所需要的配置信息。 MyBatis的配...
    消失er閱讀 1,355評(píng)論 0 3
  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis 沐扳? MyBatis 是支持定制化 SQL泥从、存儲(chǔ)過(guò)程以及高級(jí)映射的優(yōu)秀的...
    笨鳥(niǎo)慢飛閱讀 5,527評(píng)論 0 4
  • MyBatis 理論篇 [TOC] 什么是MyBatis ?MyBatis是支持普通SQL查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射...
    有_味閱讀 2,908評(píng)論 0 26
  • 你好,昨天沪摄。幸會(huì)躯嫉,明天。今天杨拐,你在哪里祈餐?
    傲慢上校Lokiwen閱讀 181評(píng)論 0 0
  • 文/瘋子阿蘭 去年7月期間和大學(xué)兩個(gè)朋友組了小隊(duì),為了慶祝我們結(jié)束了大學(xué)生活中的最后一個(gè)學(xué)期哄陶,最后一場(chǎng)考試帆阳,趁著機(jī)...
    瘋子阿蘭閱讀 499評(píng)論 0 3