前言

這個(gè)分類比較連續(xù),如果這里看不懂,或者第一次看,請(qǐng)回顧之前的博客

http://www.cnblogs.com/linkstar/category/1027239.html

終于算是把裝備弄齊全了。接下來就一步步看看MyBatis是如何工作的。

那么我們學(xué)習(xí)組件的時(shí)候就知道了,首先需要構(gòu)建一個(gè)工廠。

那么我們今天就來看看這個(gè)工廠是如何建造出來的。

 

建造工廠大致步驟

我們先從外部的我們第一次使用MyBatis的代碼開始看看工廠是如何建造的。

+ View code

1、我們需要一個(gè)配置文件 mybatis-config.xml

2、利用一個(gè)叫Resources的類的getResourceAsStream方法從xml文件中獲取里面的內(nèi)容

3、然后用SqlSessionFactoryBuilder也就是之前說的工廠構(gòu)建者把獲取的資源傳進(jìn)去就構(gòu)建出了我們需要使用的工廠

 

建造工廠的內(nèi)部過程

從大致步驟我們看起來好像很容易的樣子。但是實(shí)際其實(shí)復(fù)雜的很呢。

我們慢慢來分析。

1、首先我們可以確定的是,MyBatis建造工廠的時(shí)候肯定從我們配置的xml中獲取了相應(yīng)的配置信息,然后就能構(gòu)建出我們想要的工廠了。(只有我們想要的工廠才能生產(chǎn)出我們想要的產(chǎn)品嘛)

2、前面兩個(gè)步驟就我們知道就是把我們的資源給轉(zhuǎn)換成一個(gè)InputStream(可能建造者就認(rèn)識(shí)這樣的配置信息吧)

3、那么我們的重點(diǎn)目標(biāo)就應(yīng)該放在SqlSessionFactoryBuilder的build方法上面咯,那么走,我們進(jìn)源碼。(如果你是一步步跟前面的博客來的話,那么源碼應(yīng)該點(diǎn)一下就進(jìn)去了。。。)

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

其中我們看到了,建造之前需要對(duì)xml的資源進(jìn)行讀取。將我們的配置資源轉(zhuǎn)換成了一個(gè)XMLConfigBuilder類。

這個(gè)類可想而知就是為了解析XML而生的一個(gè)類。

具體XML的解析我肯定就不仔仔細(xì)細(xì)講了,因?yàn)榻馕鯴ML的方式很多。我們就看看MyBatis解析XML需要那些XML里面的東西咯。

我們進(jìn)入parser.parse()的parse方法。

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

然后我們注意一下,這個(gè)parse方法的返回值,Configuration

也就是說MyBatis把讀取到的數(shù)據(jù)保存到了一個(gè)Configuration類中。

跟上節(jié)奏哦?。?!

然后我們回到上一張圖中的最下方的build方法

也就是

public SqlSessionFactory build(Configuration config) {
return new DefaultSqlSessionFactory(config);
}
可以看見入?yún)⒕褪荂onfiguration如果你有興趣那么可以直接進(jìn)入Configuration類里面去看看。里面就是各種各樣的配置信息了。當(dāng)然我們關(guān)注的點(diǎn)不在這里,所以就不仔細(xì)看那些配置了。

 

我們的重點(diǎn)在這里的返回值是一個(gè)SqlSessionFactory工廠。但是看最后new的對(duì)象是DefaultSqlSessionFactory看名字我們知道是一個(gè)叫做默認(rèn)的工廠。那么我們重點(diǎn)就是在這里,這個(gè)默認(rèn)工廠怎么就造起來了呢?

 

默認(rèn)工廠、DefaultSqlSessionFactory的構(gòu)建

首先我們進(jìn)入DefaultSqlSessionFactory這個(gè)類里面去看看。


一進(jìn)去我就看到了這個(gè)這里我們可以看出兩個(gè)點(diǎn):SqlSessionFactory在MyBatis中是一個(gè)接口而不是一個(gè)類,DefaultSqlSessionFactory實(shí)現(xiàn)了這個(gè)接口。DefaultSqlSessionFactory這個(gè)類不是很長(zhǎng),我們來看看里面的方法,最后再來看看構(gòu)造方法。


如果你仔細(xì)看看,就會(huì)發(fā)現(xiàn)上面生產(chǎn)產(chǎn)品的方法都是調(diào)用的最后的openSessionFromDataSource

 

 

openSessionFromConnection這兩個(gè)方法。里面到底干啥了呢?其實(shí)從入?yún)⒑统鰠⑽覀兛梢钥闯觥#▋蓚€(gè)方法類似,我就挑一個(gè)來講)根據(jù)執(zhí)行類型,事務(wù)隔離性,是否自動(dòng)提交來創(chuàng)建DefaultSqlSession因?yàn)槲覀冏詈蟮漠a(chǎn)品是要執(zhí)行sql語句的,所以我們的產(chǎn)品也就是會(huì)話里面會(huì)帶有很多的執(zhí)行參數(shù),到底這個(gè)產(chǎn)品要做成什么樣。


這里我們需要有一些覺悟,源碼里代碼規(guī)范還是不錯(cuò)的,你看,一個(gè)在之后的不會(huì)被改變的變量就用了final進(jìn)行了修飾,如果你來寫會(huì)這樣寫嗎?這里只是生產(chǎn)產(chǎn)品而已,對(duì)于產(chǎn)品的執(zhí)行我們會(huì)在之后細(xì)講。之后我們就來看看這個(gè)構(gòu)造方法;其實(shí)構(gòu)造方法賊簡(jiǎn)單,就是單純的賦值了一下,你以為有多難??public DefaultSqlSessionFactory(Configuration configuration) {
this.configuration = configuration;
}

 

產(chǎn)品的生產(chǎn)

最后我們來看看產(chǎn)品的生產(chǎn),為之后的產(chǎn)品的執(zhí)行做個(gè)準(zhǔn)備。

首先進(jìn)入return new DefaultSqlSession(configuration, executor, autoCommit);

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

我們可以看到,也是很簡(jiǎn)單的一個(gè)構(gòu)造方法,也是設(shè)置了必要的參數(shù)主要我們先來大致瀏覽一下這個(gè)類


可以看見,SqlSession也是一個(gè)接口,而我們的默認(rèn)產(chǎn)品是實(shí)現(xiàn)了這個(gè)接口。我們看看這個(gè)接口有哪些方法其實(shí)就很明了了由于方法很多,我就不展示全部了。


從方法名字是不是就很熟悉了,就是執(zhí)行sql語句的方法嘛。所以我們的產(chǎn)品原來就是這樣的。

 

總結(jié)

最后總結(jié)一下:其實(shí)工廠的構(gòu)建其實(shí)還算是簡(jiǎn)單的,我們需要注意的點(diǎn)是,構(gòu)建過程中,讀取了xml配置,把配置加載加載進(jìn)了類里面,而且配置的讀取是有一個(gè)順序的。

配置的不同導(dǎo)致了最后工廠建立的不同,導(dǎo)致了最后生產(chǎn)的產(chǎn)品不同。

所有真正的工廠和產(chǎn)品都是接口,而使用的都是默認(rèn)工廠和默認(rèn)產(chǎn)品,去實(shí)現(xiàn)了這些接口,一般情況下我們不可能自己去實(shí)現(xiàn)這些接口然后去開發(fā)的。

最后依然留下幾個(gè)問題:

1、為什么MyBatis要這樣設(shè)計(jì)?為什么要設(shè)計(jì)成工廠這樣的模式呢?有什么樣的好處?

2、接口在這里的好處是什么?

3、Configuration這個(gè)類的作用是什么??jī)H僅是保存和提供配置信息嗎?

 

轉(zhuǎn)載請(qǐng)注明出處:http://www.cnblogs.com/linkstar/category/1027239.html

作者:LinkinStar

http://www.cnblogs.com/linkstar/p/7136168.html