前面分析了sql的執行過程,似乎有點亂,因為沒有一個整體的流程圖,不知道走到哪是哪。
好吧,我重新畫了個圖。我們再跟着圖來梳理一次吧。如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TVzI2a5YFZwhnMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxUTNxATN1MjM5AzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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源碼分析——事務