MyBatis四大核心對象之Executor

Executor是MyBatis四大核心對象之一馋嗜,是MyBatis 調(diào)度的核心,負(fù)責(zé)數(shù)據(jù)庫的操作和查詢緩存的維護辩稽,實際應(yīng)用中涉及的SqlSession接口的功能都是基于Executor調(diào)度StatementHandler惧笛、ParameterHandler、ResultSetHandler實現(xiàn)的逞泄。

1.Executor繼承體系

Executor繼承體系

如上圖所示患整,位于繼承體系最頂層的是 Executor 執(zhí)行器接口拜效,它有兩個實現(xiàn)類,分別是BaseExecutor和?CachingExecutor各谚。

BaseExecutor?是一個抽象類紧憾,這種通過抽象的實現(xiàn)接口的方式是適配器設(shè)計模式之接口適配?的體現(xiàn),是Executor 的默認(rèn)實現(xiàn)昌渤,實現(xiàn)了大部分 Executor 接口定義的功能赴穗,降低了接口實現(xiàn)的難度。BaseExecutor 的子類有三個膀息,分別是 SimpleExecutor般眉、ReuseExecutor 和 BatchExecutor。

SimpleExecutor?: 簡單執(zhí)行器潜支,是 MyBatis 中默認(rèn)使用的執(zhí)行器甸赃,每執(zhí)行一次 update 或 select,就開啟一個Statement 對象毁腿,用完就直接關(guān)閉 Statement 對象(可以是 Statement 或者是 PreparedStatment 對象)

ReuseExecutor?: 可重用執(zhí)行器辑奈,這里的重用指的是重復(fù)使用 Statement,它會在內(nèi)部使用一個 Map 把創(chuàng)建的Statement 都緩存起來已烤,每次執(zhí)行 SQL 命令的時候,都會去判斷是否存在基于該 SQL 的 Statement 對象妓羊,如果存在 Statement 對象并且對應(yīng)的 connection 還沒有關(guān)閉的情況下就繼續(xù)使用之前的 Statement 對象胯究,并將其緩存起來。因為每一個 SqlSession 都有一個新的 Executor 對象躁绸,所以我們緩存在 ReuseExecutor 上的 Statement作用域是同一個 SqlSession裕循。

BatchExecutor?: 批處理執(zhí)行器,用于將多個 SQL 一次性輸出到數(shù)據(jù)庫

CachingExecutor: 緩存執(zhí)行器净刮,先從緩存中查詢結(jié)果剥哑,如果存在就返回之前的結(jié)果;如果不存在淹父,再委托給Executor delegate 去數(shù)據(jù)庫中取株婴,delegate 可以是上面任何一個執(zhí)行器。

2.Executor 的創(chuàng)建和選擇

我們上面提到?Executor?是由 Configuration 創(chuàng)建的暑认,Configuration 會根據(jù)執(zhí)行器的類型創(chuàng)建困介,如下

這一步就是執(zhí)行器的創(chuàng)建過程,根據(jù)傳入的?ExecutorType?類型來判斷是哪種執(zhí)行器蘸际,如果不指定 ExecutorType 座哩,默認(rèn)創(chuàng)建的是簡單執(zhí)行器。它的賦值可以通過兩個地方進行賦值:

\bullet 可以通過<settings>標(biāo)簽來設(shè)置當(dāng)前工程中所有的 SqlSession 對象使用默認(rèn)的 Executor


\bullet 另外一種直接通過Java對方法賦值的方式

SqlSession sqlSession = factory.openSession(ExecutorType.SIMPLE);

3.Executor 的具體執(zhí)行過程


我們以 SqlSesion的selectList?為例粮彤,它會調(diào)用到?executor.query?方法根穷。

當(dāng)有一個查詢請求訪問的時候姜骡,首先會經(jīng)過 Executor 的實現(xiàn)類?CachingExecutor,先從緩存中查詢 SQL 是否是第一次執(zhí)行屿良,如果是第一次執(zhí)行的話圈澈,那么就直接執(zhí)行 SQL 語句,并創(chuàng)建緩存管引,如果第二次訪問相同的 SQL 語句的話士败,那么就會直接從緩存中提取。

上面這段代碼是從 selectList -> 從緩存中 query 的具體過程褥伴,如果二級緩存為空谅将,則由委托的Executor進行查詢。

Executor采用模板方法設(shè)計模式重慢,最終的執(zhí)行是由BaseExecutor的子類的doQuery方法進行執(zhí)行饥臂,到這里Executor所做的工作就完事了,后面交給StatementHandler繼續(xù)執(zhí)行似踱。后面《mybatis深度歷險》洗了的文章會介紹StatementHandler隅熙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市核芽,隨后出現(xiàn)的幾起案子囚戚,更是在濱河造成了極大的恐慌,老刑警劉巖轧简,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驰坊,死亡現(xiàn)場離奇詭異,居然都是意外死亡哮独,警方通過查閱死者的電腦和手機拳芙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皮璧,“玉大人舟扎,你說我怎么就攤上這事°参瘢” “怎么了睹限?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長惨寿。 經(jīng)常有香客問我邦泄,道長,這世上最難降的妖魔是什么裂垦? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任顺囊,我火速辦了婚禮,結(jié)果婚禮上蕉拢,老公的妹妹穿的比我還像新娘特碳。我一直安慰自己诚亚,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布午乓。 她就那樣靜靜地躺著站宗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪益愈。 梳的紋絲不亂的頭發(fā)上梢灭,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音蒸其,去河邊找鬼敏释。 笑死,一個胖子當(dāng)著我的面吹牛摸袁,可吹牛的內(nèi)容都是我干的钥顽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼靠汁,長吁一口氣:“原來是場噩夢啊……” “哼蜂大!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝶怔,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奶浦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踢星,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體财喳,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年斩狱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扎瓶。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡所踊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出概荷,到底是詐尸還是另有隱情秕岛,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布误证,位于F島的核電站继薛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏愈捅。R本人自食惡果不足惜遏考,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蓝谨。 院中可真熱鬧灌具,春花似錦青团、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诱贿,卻和暖如春娃肿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背珠十。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工料扰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宵睦。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓记罚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親壳嚎。 傳聞我的和親對象是個殘疾皇子桐智,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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