1. 程式人生 > >Mybatis執行原理原始碼分析

Mybatis執行原理原始碼分析

執行中涉及到的類以及原始碼剖析

1.1 Resources:MyBatis 中 IO 流的工具類

Mybatis執行的第一步首先需要載入全域性配置檔案(參照Mybatis官網上的例子,就是mybatis-config.xml這個檔案),載入配置檔案利用了Resources的getResourceAsStream()方法,這個方法底層是去呼叫ClassLoaderWrapper類的getResourceAsStream()方法,具體往下自己研究,經過呼叫以後返回一個IO流InputStream物件。

1.2 SqlSessionFactoryBuilder():構建器

獲得InputStream物件以後我們需要去獲得SqlSessionFactory這個工廠物件,為了獲得這個工廠物件我們這個需要用到SqlSessionFactoryBuilder類,進入這個類裡面看,既沒有給我們提供靜態構造方法,也沒有有參構造方法,只有過載了一個bulid()方法,具體看bulid方法,返回的是SqlSessionFactory這個工廠物件,於是我們建立SqlSessionFactoryBuilder類,接著呼叫bulid方法,傳入引數。new SqlSessionFactoryBuilder().build(inputStream);

1.3 XMLConfigBuilder:MyBatis全域性配置檔案內容構建器類

我們這裡來深入研究一下SqlSessionFactoryBuilder類的build方法,進入原始碼發現傳入InputStream物件之後,需要用到XMLConfigBuilder這個類,這個類是幹什麼的?我們稱它為全域性配置檔案內容的構建器,利用它將最終返回我們需要的SqlSessionFactory工廠物件的實現類DefaultSqlSessionFactory。

1.4 Configuration:封裝了全域性配置檔案所有配置資訊.

利用XMLConfigBuilder解析全域性配置檔案流,剖析原始碼,我們可以發現這裡用到了XPathParser類,這個類幫助我們解析mybatis-config.xml檔案中的根標籤configuration,封裝裡面的子標籤,然後通過XMLConfigBuilder類中的parseConfiguration方法一一解析裡面的子標籤,將所有的配置檔案資訊解析結果存放到Configuration中,將Configuration返回交給SqlSessionFactoryBuilder構建器的build方法,這個方法new一個DefaultSqlSessionFactory物件並返回。

1.5 DefaultSqlSessionFactory 是SqlSessionFactory介面的實現類

當完成了上面的步驟以後,我們操作SqlSessionFactory實際上就是操作DefaultSqlSessionFactory類,在DefaultSqlSessionFactory類裡面,實現SqlSessionFactory中的方法openSession()其實就是在呼叫openSessionFromDataSource()方法。

1.6 Transaction:事務類、1.7 TransactionFactory:事務工廠

在openSessionFromDataSource()方法中,我們要用到一個事務物件Transaction,這個物件通過TransactionFactory事務工廠接收來自configuration的Environment類(存放環境變數)去例項化物件。

1.8 Executor:MyBatis 執行器

同時還要建立SqlSession的執行器Executor,這個執行器也是通過configuration去例項化的。

1.9 DefaultSqlSession 是 SqlSession 介面的實現類

最後,我們根據上面得到的配置資訊、事務執行器去例項化DefaultSqlSession,將它傳遞給SqlSession介面。最後開發者根據專案需求去使用SqlSession介面中的API完成具體的事務操作。如果事務執行成功,將提交資料到資料庫中commit(),關閉SqlSession連線,如果失敗,丟擲相關錯誤異常,回滾事務rollback()。

1.10 ExceptionFactory:MyBatis 中異常工廠

當產生異常時候,Mybatis提供了異常工廠也就是ExceptionFactory,通過它可以去構建出來自定義的異常資訊。有助於開發者在遇到異常的時候能快速找到錯誤所在。

以上就是MyBatis的執行原理流程,下面貼出北京尚學堂培訓的張佳明老師繪製的流程圖幫助大家理解: