當面試官問我Mybatis初始化原理時,我笑了

對于任何框架而言,在使用前都要進行一系列的初始化,MyBatis也不例外。本章將通過以下幾點詳細介紹MyBatis的初始化過程。

MyBatis的初始化做了什么

歡迎工作一到五年的Java工程師朋友們加入Java程序員開發: 854393687

群內提供免費的Java架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

MyBatis基于XML配置文件創建Configuration對象的過程

手動加載XML配置文件創建Configuration對象完成初始化,創建并使用SqlSessionFactory對象

涉及到的設計模式

一、 MyBatis的初始化做了什么

任何框架的初始化,無非是加載自己運行時所需要的配置信息。MyBatis的配置信息,大概包含以下信息,其高層級結構如下:

× configuration 配置

× properties 屬性

× settings 設置

×?typeAliases 類型命名

×?typeHandlers 類型處理器

×?objectFactory 對象工廠

×?plugins 插件

×?environments 環境

× environment 環境變量

×?transactionManager 事務管理器

× dataSource 數據源

×映射器

MyBatis的上述配置信息會配置在XML配置文件中,那么,這些信息被加載進入MyBatis內部,MyBatis是怎樣維護的呢?

MyBatis采用了一個非常直白和簡單的方式---使用?org.apache.ibatis.session.Configuration?對象作為一個所有配置信息的容器,Configuration對象的組織結構和XML配置文件的組織結構幾乎完全一樣(當然,Configuration對象的功能并不限于此,它還負責創建一些MyBatis內部使用的對象,如Executor等,這將在后續的文章中討論)。如下圖所示:

MyBatis根據初始化好Configuration信息,這時候用戶就可以使用MyBatis進行數據庫操作了。

可以這么說,MyBatis初始化的過程,就是創建 Configuration對象的過程。

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

基于XML配置文件:基于XML配置文件的方式是將MyBatis的所有配置信息放在XML文件中,MyBatis通過加載并XML配置文件,將配置文信息組裝成內部的Configuration對象

基于Java API:這種方式不使用XML配置文件,需要MyBatis使用者在Java代碼中,手動創建Configuration對象,然后將配置參數set 進入Configuration對象中


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

接下來我們將通過 基于XML配置文件方式的MyBatis初始化,深入探討MyBatis是如何通過配置文件構建Configuration對象,并使用它的。

二、MyBatis基于XML配置文件創建Configuration對象的過程

現在就從使用MyBatis的簡單例子入手,深入分析一下MyBatis是怎樣完成初始化的,都初始化了什么。看以下代碼:? ?

有過MyBatis使用經驗的讀者會知道,上述語句的作用是執行com.foo.bean.BlogMapper.queryAllBlogInfo?定義的SQL語句,返回一個List結果集。總的來說,上述代碼經歷了mybatis初始化 -->創建SqlSession -->執行SQL語句?返回結果三個過程。

上述代碼的功能是根據配置文件mybatis-config.xml? 配置文件,創建SqlSessionFactory對象,然后產生SqlSession,執行SQL語句。而mybatis的初始化就發生在第三句:SqlSessionFactory?sqlSessionFactory?=?new?SqlSessionFactoryBuilder().build(inputStream);? 現在就讓我們看看第三句到底發生了什么。

MyBatis初始化基本過程:

SqlSessionFactoryBuilder根據傳入的數據流生成Configuration對象,然后根據Configuration對象創建默認的SqlSessionFactory實例。

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

由上圖所示,mybatis初始化要經過簡單的以下幾步:

1.?調用SqlSessionFactoryBuilder對象的build(inputStream)方法;

2.?SqlSessionFactoryBuilder會根據輸入流inputStream等信息創建XMLConfigBuilder對象;

3.?SqlSessionFactoryBuilder調用XMLConfigBuilder對象的parse()方法;

4.?XMLConfigBuilder對象返回Configuration對象;

5.?SqlSessionFactoryBuilder根據Configuration對象創建一個DefaultSessionFactory對象;

6.?SqlSessionFactoryBuilder返回?DefaultSessionFactory對象給Client,供Client使用。

SqlSessionFactoryBuilder相關的代碼如下所示:

上述的初始化過程中,涉及到了以下幾個對象:

SqlSessionFactoryBuilder : SqlSessionFactory的構造器,用于創建SqlSessionFactory,采用了Builder設計模式

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

SqlSessionFactory:SqlSession工廠類,以工廠形式創建SqlSession對象,采用了Factory工廠設計模式

XmlConfigParser :負責將mybatis-config.xml配置文件解析成Configuration對象,共SqlSessonFactoryBuilder使用,創建SqlSessionFactory

創建Configuration對象的過程

接著上述的 MyBatis初始化基本過程討論,當SqlSessionFactoryBuilder執行build()方法,調用了XMLConfigBuilder的parse()方法,然后返回了Configuration對象。那么parse()方法是如何處理XML文件,生成Configuration對象的呢?

1. XMLConfigBuilder會將XML配置文件的信息轉換為Document對象,而XML配置定義文件DTD轉換成XMLMapperEntityResolver對象,然后將二者封裝到XpathParser對象中,XpathParser的作用是提供根據Xpath表達式獲取基本的DOM節點Node信息的操作。如下圖所示:? ??

2.? 之后XMLConfigBuilder調用parse()方法:會從XPathParser中取出 <configuration>節點對應的Node對象,然后解析此Node節點的子Node:properties, settings, typeAliases,typeHandlers, objectFactory, objectWrapperFactory, plugins, environments,databaseIdProvider, mappers

注意:在上述代碼中,還有一個非常重要的地方,就是解析XML配置文件子節點<mappers>的方法mapperElements(root.evalNode("mappers")), 它將解析我們配置的Mapper.xml配置文件,Mapper配置文件可以說是MyBatis的核心,MyBatis的特性和理念都體現在此Mapper的配置和設計上,我們將在后續的文章中討論它,敬請期待~?

3.? 然后將這些值解析出來設置到Configuration對象中。

解析子節點的過程這里就不一一介紹了,用戶可以參照MyBatis源碼仔細揣摩,我們就看上述的environmentsElement(root.evalNode("environments"));?方法是如何將environments的信息解析出來,設置到Configuration對象中的:

4.? 返回Configuration對象?

我們將上述的MyBatis初始化基本過程的序列圖細化。

三、手動加載XML配置文件創建Configuration對象完成初始化,創建并使用SqlSessionFactory對象

我們可以使用XMLConfigBuilder手動解析XML配置文件來創建Configuration對象,代碼如下:

四、涉及到的設計模式

初始化的過程涉及到創建各種對象,所以會使用一些創建型的設計模式。在初始化的過程中,Builder模式運用的比較多。

Builder模式應用1: SqlSessionFactory的創建

對于創建SqlSessionFactory時,會根據情況提供不同的參數,其參數組合可以有以下幾種:

由于構造時參數不定,可以為其創建一個構造器Builder,將SqlSessionFactory的構建過程和表示分開:

MyBatis將SqlSessionFactoryBuilder和SqlSessionFactory相互獨立。

Builder模式應用2: 數據庫連接環境Environment對象的創建

在構建Configuration對象的過程中,XMLConfigParser解析 mybatis XML配置文件節點<environment>節點時,會有以下相應的代碼:

在Environment內部,定義了靜態內部Builder類:

歡迎工作一到五年的Java工程師朋友們加入Java程序員開發: 854393687

群內提供免費的Java架構學習資料(里面有高可用、高并發、高性能及分布式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用"沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容

  • 一、 MyBatis的初始化做了什么 任何框架的初始化,無非是加載自己運行時所需要的配置信息。 MyBatis的配...
    消失er閱讀 1,363評論 0 3
  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的...
    笨鳥慢飛閱讀 5,561評論 0 4
  • MyBatis 理論篇 [TOC] 什么是MyBatis ?MyBatis是支持普通SQL查詢,存儲過程和高級映射...
    有_味閱讀 2,928評論 0 26
  • 你好,昨天。幸會,明天。今天,你在哪里?
    傲慢上校Lokiwen閱讀 184評論 0 0
  • 文/瘋子阿蘭 去年7月期間和大學兩個朋友組了小隊,為了慶祝我們結束了大學生活中的最后一個學期,最后一場考試,趁著機...
    瘋子阿蘭閱讀 510評論 0 3