天天看點

扒開 SqlSession 的外衣

老規矩,先上案例代碼,我們按照這個案例一步一步的搞定Mybatis源碼。

前面我們已經講了Mybatis是如何解析相關配置檔案的,如果怕迷路,還是建議先看前一篇文章:

Mybatis是如何解析配置檔案的?看完終于明白了

由于很多小夥伴在催,說Mybatis源碼系列好像何時才有下文了,為此老田熬夜寫了這篇。

扒開 SqlSession 的外衣

繼續開撸~~

前面那篇文章已經分析了,這裡的sqlSessionFactory其實就是DefaultSqlSessionFactory。

是以這裡,我們就從DefaultSqlSessionFactory裡的openSession方法開始。

下面我們就來逐個攻破。

事務工廠類型可以配置為JDBC類型或者MANAGED類型。

扒開 SqlSession 的外衣
❝ JdbcTransactionFactory生産JdbcTransaction。 ManagedTransactionFactory生産ManagedTransaction。 ❞

如果配置的JDBC,則會使用Connection對象的commit()、rollback()、close()方法來管理事務。

如果我們配置的是MANAGED,會把事務交給容器來管理,比如JBOSS,Weblogic。因為我們是本地跑的程式,如果配置成MANAGED就會不有任何事務。

但是,如果我們項目中是Spring內建Mybatis,則沒有必要配置事務,因為我們會直接在applicationContext.xml裡配置資料源和事務管理器,進而覆寫Mybatis的配置。

調用configuration的<code>newExecutor</code>方法建立Executor。

此方法分三個步驟。

Executor的基本類型有三種:

SIMPLE為預設類型。

為什麼要讓抽象類BaseExecutor實作Executor接口,然後讓具體實作類繼承抽象類呢?

這就是模闆方法模式的實作。

模闆方法模式就是定義一個算法骨架,并允許子類為一個或者多個步驟提供實作。模闆方法是得子類可以再不改變算法結構的情況下,重新定義算法的某些步驟。

關于模闆方法模式推薦閱讀:

如何快速掌握模闆方法模式

抽象方法是在子類彙總實作的,每種執行器自己實作自己的邏輯,BaseExecutor最終會調用到具體的子類中。

在上面代碼中的第二步

如果<code>cacheEnabled=true</code>,會用裝飾器設計模式對Executor進行裝飾。

緩存裝飾完後,就會執行

這裡會對Executor植入插件邏輯。

比如:分頁插件中就需要把插件植入的Executor

扒開 SqlSession 的外衣

好了,到此,執行器建立的就搞定了。

把前面解析配置檔案建立的Configuration對象和建立的執行器Executor賦給DefaultSqlSession中的屬性。

到這裡,SqlSession(DefaultSqlSession)對象就建立完畢。

本文我們講了如何建立SqlSession的幾個步驟,最後我們獲得一個DefaultSqlSession對象,裡面包含了執行器Executor和配置對象Configuration。Executor是SQL的實際執行對象。Configuration裡儲存着配置檔案内容。

本文源碼分析的整個流程如下圖:

扒開 SqlSession 的外衣

碼字不易,點個贊呗

繼續閱讀