天天看點

Mybatis源碼分析——sql執行過程的類圖

前面分析了sql的執行過程,似乎有點亂,因為沒有一個整體的流程圖,不知道走到哪是哪。

好吧,我重新畫了個圖。我們再跟着圖來梳理一次吧。如下

Mybatis源碼分析——sql執行過程的類圖

SqlSession:有3個實作類,分别是DefaultSqlSession、SqlSessionManager、SqlSessionTemplate,後2者其實也是通過代理的方式,最終由DefaultSqlSession實作功能。在DefaultSqlSessionFactory的openSessionFromDataSource方法中傳回DefaultSqlSession,同時根據ExecutorType綁定了一個Executor。

在此環節通過statementId擷取MappedStatement。

Executor:有2個實作類,BaseExecutor和CachingExecutor。如果開啟了緩存,則交給CachingExecutor執行,CachingExecutor使用了模闆方法的模式,最終還是交給BaseExecutor的實作類來執行。BaseExecutor有3個實作類,分别是BatchExecutor、ReuseExecutor和SimpleExecutor,由ExecutorType來選擇使用哪個。

在此環節将入參封裝成BoundSql,如果使用了緩存并且緩存中存在的話,在此層傳回資料。

同時擷取Connection,并通過StatementType擷取對應的StatementHandler來建立Statement。

StatementHandler:有2個實作類,BaseStatementHandler和RoutingStatementHandler,RoutingStatementHandler使用了政策模式,最終還是交給BaseStatementHandler的3個實作類來執行,分别是CallableStatementHandler、PreparedStatementHandler(預設)、SimpleStatementHandler,根據StatementType來選擇使用哪個。

此層負責從BoundSql取出sql和入參,使用ParameterHandler綁定參數到Statement,然後調用JDBC接口執行。

ParameterHandler:隻有一個實作類,就是DefaultParameterHandler。

負責從BoundSql取出參數綁定到Statement。

ResultSetHandler:隻有一個實作類,就是DefaultResultSetHandler。

負責從Statement取出查詢結果集ResultSet,通過對應的ResultHandler處理,然後傳回。

如果是insert/update/delete操作,就是直接傳回int了。

如了,整個流程看起來是不是清晰好多了呢,詳細代碼,翻上一篇來看吧。

上一篇  Mybatis源碼分析——如何執行一條sql

下一篇  Mybatis源碼分析——事務

上一篇: 編碼-1

繼續閱讀