SqlSessionFactory射亏、SqlSessionFactoryBean、SqlSession和SqlSessionTemplate的不解姻緣系列之一(總體闡述)

寫在之前

最近在使用Mybatis的時候很是好奇一些實現(xiàn)細節(jié)竭业,所以也就多留意了下智润。 SqlSessionFactory、SqlSessionFactoryBean未辆、SqlSession和SqlSessionTemplate是大家直接使用比較多的窟绷。這里我先不說這些類的實現(xiàn)細節(jié),先大致說下它們之間的關(guān)系咐柜,相信會有同樣的人對于它們之間的關(guān)系感興趣兼蜈。設(shè)計者設(shè)計這個類的時候肯定是有目的性的,搞清楚目的性再去看實現(xiàn)源碼才會有方向性拙友,從而達到事半功倍的效果为狸。我會結(jié)合自己的理解,連續(xù)通過幾篇文章來講述下它們之間的感情糾葛遗契,并結(jié)合生成環(huán)境中的常用方式進行實例說明辐棒。若是您發(fā)現(xiàn)文章有錯誤的地方,還望不惜筆墨牍蜂,吾當虛心接受漾根,感激涕零。

正文

1. SqlSession和SqlSessionTemplate

SqlSession

SqlSession實現(xiàn)了Closeable接口鲫竞,代表SqlSession是可以關(guān)閉的辐怕,那也就是說SqlSession代表一種可關(guān)閉的連接,也正如名字所表達的是Session从绘,Session對于開發(fā)人員來說并不陌生寄疏。例如:瀏覽器和服務(wù)器之間的會話也是Session,Session用來維護無狀態(tài)請求之間的狀態(tài)的信息僵井。所以說SqlSession也是一種會話赁还,數(shù)據(jù)庫連接客戶端和數(shù)據(jù)庫Server之間的一種會話,并維護了客戶端和數(shù)據(jù)庫Server的一些狀態(tài)信息驹沿。

看源碼中的描述:

SqlSession

SqlSession是接口,接口是一種高層次的抽象蹈胡,你可以認為接口是聲明了一種能力渊季。朋蔫。若是實現(xiàn)了該接口,就擁有了該接口的能力(方法)和特征(屬性)却汉。官方的描述是:“你可以通過它執(zhí)行命令驯妄、獲取mapper和管理事務(wù)”。那也就是說合砂,只要我實現(xiàn)了SqlSession接口青扔,那我就有了同樣的能力了。至于它是如何實現(xiàn)發(fā)送sql語句翩伪,管理事務(wù)和獲取mapper的微猖,這是后話,后續(xù)再說缘屹。

我們再來看看凛剥,實現(xiàn)了SqlSession的類有哪些?

SqlSession的實現(xiàn)類

正如圖中所示轻姿,DefaultSqlSession是SqlSession接口的默認實現(xiàn)犁珠;SqlSessionTemplate也是SqlSession的一種實現(xiàn)。SqlSessionTemplate除了實現(xiàn)了SqlSession接口外互亮,還是實現(xiàn)了下面的接口:

SqlSessionTemplate

實現(xiàn)了DisposableBean接口犁享,也就代表了SqlSessionTemplate的實例被Bean工廠發(fā)現(xiàn)后,會把它們納入整個生命周期的管理過程中豹休,當BeanFactory被嘗試銷毀時炊昆,Beans的管理者會以回調(diào)的方式調(diào)用SqlSessionTemplate的destroy()方法。 我們來看看SqlSessionTemplate的destroy()方法的實現(xiàn):

destroy()方法

默認實現(xiàn)是空方法慕爬,具體實現(xiàn)你自己可以重寫窑眯。

2. SqlSessionFactory和SqlSessionFactoryBean

SqlSessionFactory

如上圖,SqlSessionFactory也是一種抽象定義医窿,其能力(方法 )就是打開一個會話(客戶端和數(shù)據(jù)庫Server)磅甩,而且重載了很多不同的參數(shù),你可以改變這些參數(shù)自定義會話過程中的一些默認行為姥卢。例如:可以設(shè)置自動提交事務(wù)或是關(guān)閉自動提交卷要;可以設(shè)置獲取數(shù)據(jù)庫連接的線程的類型(重用,每次新產(chǎn)生等等)独榴;也可以獲取整個Mybatis的配置信息的Configuration對象實例僧叉,關(guān)于Configuration的討論我們下期再說。

SqlSessionFactory的實現(xiàn)

SqlSessionFactory的實現(xiàn)也有兩種棺榔,甚至你可以自定義實現(xiàn)瓶堕。默認實現(xiàn)是DefaultSqlSessionFactory

DefaultSqlSessionFactory

DefaultSqlSessionFactory具體實現(xiàn)了SqlSessionFactory接口定義的抽象行為≈⑿總而言之郎笆,SqlSessionFactory就是生產(chǎn)SqlSession對象的工廠谭梗。那也就是說整個Mybatis中,如果只有一個數(shù)據(jù)庫Server要連接宛蚓,那么只需要一個工廠就夠了(只有一個SqlSessionFactory的實例對象)激捏,而SqlSession可以自由的被關(guān)閉,也就代表SqlSession是需要反復(fù)被創(chuàng)建的凄吏。上面說到SqlSession是關(guān)聯(lián)到具體數(shù)據(jù)庫連接的远舅,但是如果每次創(chuàng)建和銷毀都直接操作物理連接的話,那么這個資源浪費很高痕钢,效率很低图柏。請看DefaultSqlSessionFactory的方法:

DefaultSqlSessionFactory的方法

上圖的實現(xiàn)中是有基于連接池技術(shù)的。使用數(shù)據(jù)庫連接池時盖喷,關(guān)閉SqlSession實例 爆办,其實只是把數(shù)據(jù)庫連接對象(代表物理資源)放回到對象池中,并沒有直接銷毀课梳,使用連接池技術(shù)極大提高了物理資源利用率距辆,縮減了創(chuàng)建物理連接所需的時間、資源等等暮刃。

SqlSessionFactoryBean

如上圖跨算,SqlSessionFactoryBean直接實現(xiàn)了三個接口。實現(xiàn)ApplicationListener代表SqlSessionFactoryBean有能力監(jiān)控 Application發(fā)出的一些事件通知椭懊;實現(xiàn)InitializingBean代表SqlSessionFactoryBean中的afterPropertiesSet()方法會在Bean初始化屬性完成后立即被調(diào)用诸蚕;實現(xiàn)了FactoryBean代表SqlSessionFactoryBean的實例不再是普通的Bean對象,而是可以產(chǎn)生自己Bean的一種工廠氧猬,該工廠產(chǎn)生的Bean同樣可以被納入Spring的生命周期背犯。

FactoryBean的官方描述

正如SqlSessionFactoryBean的名字,它是生產(chǎn)SqlSessionFactory的工廠Bean盅抚。

綜上所述漠魏,SqlSessionFactoryBean是生產(chǎn)SqlSessionFactory的一種工廠Bean;SqlSessionFactory是一種生產(chǎn)SqlSession的工廠妄均;SqlSession是代表數(shù)據(jù)庫連接客戶端和數(shù)據(jù)庫Server之間的會話信息柱锹;SqlSessionTemplate是SqlSession的一個具體實現(xiàn)。如下圖:

關(guān)系圖

說明:圖中的藍色箭頭不代表繼承的含義丰包。

寫在最后

看完上面的大致講述后禁熏,你會不會有些問題要問呢?比如:既然SqlSessionFactory是產(chǎn)生SqlSession的了邑彪,那干嘛又搞出來SqlSessionTemplate呢瞧毙?它到底是干嘛的呢?說到SqlSessionTemplate和SqlSession、SqlSessionFactory之間的糾纏宙彪,就不得不說動態(tài)代理了撑柔。下期我們將講述SqlSessionTemplate的實現(xiàn)細節(jié),我們的代碼中是如何產(chǎn)生Sql語句并發(fā)送給數(shù)據(jù)庫Server的您访,通過進一步的分析讓你更加了解Mybatis的實現(xiàn)細節(jié)末梢。預(yù)知后事如何剪决,且看下回分解灵汪。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市柑潦,隨后出現(xiàn)的幾起案子享言,更是在濱河造成了極大的恐慌,老刑警劉巖渗鬼,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件览露,死亡現(xiàn)場離奇詭異,居然都是意外死亡譬胎,警方通過查閱死者的電腦和手機差牛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來堰乔,“玉大人偏化,你說我怎么就攤上這事「浜睿” “怎么了侦讨?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苟翻。 經(jīng)常有香客問我韵卤,道長,這世上最難降的妖魔是什么崇猫? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任沈条,我火速辦了婚禮,結(jié)果婚禮上邓尤,老公的妹妹穿的比我還像新娘拍鲤。我一直安慰自己,他們只是感情好汞扎,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布季稳。 她就那樣靜靜地躺著,像睡著了一般澈魄。 火紅的嫁衣襯著肌膚如雪景鼠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音铛漓,去河邊找鬼溯香。 笑死,一個胖子當著我的面吹牛浓恶,可吹牛的內(nèi)容都是我干的玫坛。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼包晰,長吁一口氣:“原來是場噩夢啊……” “哼湿镀!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伐憾,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤勉痴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后树肃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒸矛,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年胸嘴,在試婚紗的時候發(fā)現(xiàn)自己被綠了雏掠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡筛谚,死狀恐怖磁玉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驾讲,我是刑警寧澤蚊伞,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站吮铭,受9級特大地震影響时迫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谓晌,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一掠拳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纸肉,春花似錦溺欧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至烦味,卻和暖如春聂使,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工柏靶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弃理,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓屎蜓,卻偏偏與公主長得像痘昌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炬转,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 1. 簡介 1.1 什么是 MyBatis 控汉? MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,429評論 0 4
  • 從三月份找實習(xí)到現(xiàn)在返吻,面了一些公司,掛了不少乎婿,但最終還是拿到小米测僵、百度、阿里谢翎、京東捍靠、新浪、CVTE森逮、樂視家的研發(fā)崗...
    時芥藍閱讀 42,184評論 11 349
  • 單獨使用mybatis是有很多限制的(比如無法實現(xiàn)跨越多個session的事務(wù))榨婆,而且很多業(yè)務(wù)系統(tǒng)本來就是使用sp...
    七寸知架構(gòu)閱讀 3,431評論 0 53
  • 1 引言# 本文主要講解JDBC怎么演變到Mybatis的漸變過程,重點講解了為什么要將JDBC封裝成Mybait...
    七寸知架構(gòu)閱讀 76,424評論 36 980
  • 01 同事們在議論:“你們知道嗎?上個月西安又一個女的跳樓了闷供,還是帶著兒子一起跳的烟央,據(jù)說又是因為抑郁。好可怕啊歪脏,我...
    樸素者閱讀 3,517評論 2 5