mybatis源碼閱讀(1)

楔子

之前用了很久的mybatis,但是從來沒有去認(rèn)真的看過它的源代碼,于是便產(chǎn)生的閱讀mybatis源代碼的念頭纤子。無論做什么事,開始的著手點(diǎn)是最難的。對(duì)于閱讀源代碼控硼,最好的方式無外乎寫一下小的case泽论,然后一步一步debug跟進(jìn)。但是由mybatis源代碼中提供完善的單元測(cè)試卡乾,因此我們可以不必自己去寫case翼悴,直接使用這些單元測(cè)試就可以了。

例如:使用mybatis簡(jiǎn)單的執(zhí)行一條SQL就可以通過SqlSessionTest這個(gè)test suit來了解幔妨,mybatis會(huì):

  • 創(chuàng)建data source鹦赎,讀取配置文件,創(chuàng)建session manager
    @BeforeClass
    public static void setup() throws Exception {
      createBlogDataSource();
      final String resource = "org/apache/ibatis/builder/MapperConfig.xml";
      final Reader reader = Resources.getResourceAsReader(resource);
      sqlMapper = new SqlSessionFactoryBuilder().build(reader);
    }
    
  • 打開session误堡,執(zhí)行sql古话,完成后關(guān)閉session
     @Test
      public void shouldSelectCountOfPosts() throws Exception {
         SqlSession session = sqlMapper.openSession();
         try {
            Integer count = session.selectOne("org.apache.ibatis.domain.blog.mappers.BlogMapper.selectCountOfPosts");
        assertEquals(5, count.intValue()); 
              } finally {
            session.close();
       }
    

以上就是mybatis如果執(zhí)行簡(jiǎn)單的sql。
我們可以看到锁施,mybatis首先會(huì)通過讀取配置創(chuàng)初始化環(huán)境陪踩。然后在執(zhí)行SQL的時(shí)候,首先回去打開一個(gè)session悉抵,執(zhí)行完SQL之后肩狂,會(huì)關(guān)閉session。對(duì)于環(huán)境的初始化姥饰,我們?cè)谙乱还?jié)在看傻谁,首先我們來看session的創(chuàng)建。

Session Factory

從上面的代碼列粪,我們可以看到审磁,mybatis會(huì)通過讀取配置文件創(chuàng)建一個(gè)session factory,這里使用了抽象工廠的模式岂座,session factory是一個(gè)interface态蒂,

public interface SqlSessionFactory {

  SqlSession openSession();

  SqlSession openSession(boolean autoCommit);
  SqlSession openSession(Connection connection);
  SqlSession openSession(TransactionIsolationLevel level);

  SqlSession openSession(ExecutorType execType);
  SqlSession openSession(ExecutorType execType, boolean autoCommit);
  SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
  SqlSession openSession(ExecutorType execType, Connection connection);

  Configuration getConfiguration();

}

openSession方法會(huì)返回一個(gè)SqlSession。同樣SqlSession也只是一個(gè)繼承了Closeable接口掺逼。

public interface SqlSession extends Closeable

mybatis通過兩個(gè)SqlSessionFactory的實(shí)現(xiàn)

  • DefaultSqlSessionFactory
  • SqlSessionManager
    與之相應(yīng)的有兩個(gè)SqlSession的實(shí)現(xiàn)
  • DefaultSqlSession
  • SqlSessionManager
    在我們的test case中,mybatis使用的是DefaultSqlSessionFactory瓤介,所以我們來看DefaultSqlSessionFactory吕喘。在DefaultSqlSessionFactory中,有兩種方式來open session刑桑,
    一種是通過datasource來創(chuàng)建transaction氯质,一種是通過connect創(chuàng)建。同時(shí)兩種方式都會(huì)根據(jù)configuration創(chuàng)建executer祠斧,以及transaction的commit方式闻察,然后以參數(shù)形式維護(hù)到sql session中。同樣的兩種方式最終都是指向JdbcTransaction,回歸到最根本的jdbc transaction辕漂。

上面的就是我們mybatis源碼閱讀的開始呢灶,下來我們將學(xué)習(xí)mybatis如何讀取配置初始化環(huán)境。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钉嘹,一起剝皮案震驚了整個(gè)濱河市鸯乃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跋涣,老刑警劉巖缨睡,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異陈辱,居然都是意外死亡奖年,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門沛贪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陋守,“玉大人,你說我怎么就攤上這事鹏浅⌒嵋澹” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵隐砸,是天一觀的道長(zhǎng)之碗。 經(jīng)常有香客問我,道長(zhǎng)季希,這世上最難降的妖魔是什么褪那? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮式塌,結(jié)果婚禮上博敬,老公的妹妹穿的比我還像新娘。我一直安慰自己峰尝,他們只是感情好偏窝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著武学,像睡著了一般祭往。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上火窒,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天硼补,我揣著相機(jī)與錄音,去河邊找鬼熏矿。 笑死已骇,一個(gè)胖子當(dāng)著我的面吹牛离钝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褪储,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卵渴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了乱豆?” 一聲冷哼從身側(cè)響起奖恰,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宛裕,沒想到半個(gè)月后瑟啃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揩尸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年蛹屿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岩榆。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡错负,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勇边,到底是詐尸還是另有隱情犹撒,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布粒褒,位于F島的核電站识颊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奕坟。R本人自食惡果不足惜祥款,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望月杉。 院中可真熱鬧刃跛,春花似錦、人聲如沸苛萎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腌歉。三九已至蛙酪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間究履,已是汗流浹背滤否。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工脸狸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留最仑,地道東北人藐俺。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像泥彤,于是被迫代替她去往敵國和親欲芹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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