對(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è)交代涵亏!