Mybatis源碼剖析—第二講
那我們在講完了mappedstatement這個類,它的一個核心作用之后呢?那下面我有一個問題想問問各位。作為mappedstatement來講,它封裝的是一個select標簽或者insert標簽。但是呢,我們需要大家注意的是什么?在我們開發的過程當中啊,這些我們所寫的。select標簽也好,還有insert標簽兒,update標簽兒delay的標簽也罷,那么除了它標簽兒上的這些內容之外。實際上,我們說它還有一個很重要的東西,
這個東西是什么呢?sql語句。哎,不管是insert標簽當中的這個insert into的這條sql,還是我們所說的查詢當中的這些select的sqk?那你會發現,作為這些標簽,里面是不是都有這個SQL的封裝啊?那么,作為這個sql的封裝?它在mybatis源碼當中是以什么形式來體現的呢?那首先我們大家可以確定的是什么呀?就是一切皆對象,什么最終都會被封裝成對象的形式,
SQL語句,它一定是string類型的,但是它并沒有。僅僅用一個string單獨代表這個sql,而是把這個sql怎么著封裝在了這個類里。那當然,我們說與sql相關的還有什么?那顯然還有它的相關的參數。因為我們知道后續我們在寫sql的時候,它一定不是簡單的說select from, 它一定會帶上相關參數,將這些統一封裝成BoundSql類 從屬于Mappedstatement, 這個秉承著責任單一,各司其職的面向對象的設計方式
就目前理解而言 : SqlSession封裝JDBC,操作MappedStatement,其實并非這樣
操作里包含了,查和改,改包括了增,刪,改,還有處理緩存,這些操作由Executor實現,為什么設計成接口呢,根據設計原則來說,操作相關的類型都要設計成接口
它的設計也是這樣,查看子類快捷鍵 ctrl + alt + B ,我們回到Executor類,
這個BaseExecute實際上是這個Execute的一個適配器,實現了一些基本功能,這三個才是最核心的
操作類對象 (SqlSession) ---> 門面 ExcutorExcutor 是Mybatis中處理功能的核心1. 增刪改update 查query2. 事務操作 提交 回滾3. 緩存相關的操作Excutor接口 (適配器模式) 操作相關都要設計成接口BatchExcutorJDBC中批處理的操作, BatchExcutor ReuseExcutor目的:復用 Statement (需要sql一樣)insert into t_user(ID,name)values(1,‘name1’);insert into t_user(ID,name)values(2,‘name2’);SimpleExcutor常用Excutor Mybatis推薦 默認 Configuration protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
為什么需要批處理呢,因為每次connect連接操作系統都會消耗資源
現在我們知道了,executor是完成操作的。但其實真正完成數據庫操作的是statementhandler。那為什么不能把這個executor給省略了,直接用statementhandler呢?還是我們所說的。單一職責的問題
executor他做了三件事。第一件事是增刪改。也就是與數據庫的。操作那除此之外,它是不是還有事物的控制?它是不是還有緩存的操作 所以實際上executor他做的是三件最主要的工作。那后續它之所以在這樣的封裝的原因是它把其中的第一部分操作。由statementhandler來進行工作。
采用了適配器模式StatmentHandlerStatementHandler是Mybatis封裝了JDBC Statement,真正Mybatis進行數據庫訪問操作的核心功能:增刪改差StatementHandler接口SimpleStatementHandlerJDBC 操作 PreparedStatementHandlerCallableStatementHandler ParameterHandler目的:Mybatis參數 ---》 JDBC 相關的參數 @Param ---> #{} --- > ?ResultSetHandler目的:對JDBC中查詢結果集 ResultSet 進行封裝 TypeHandlerJava程序操作 數據庫Java類型 數據庫類型String varcharint numberint int excutor和statementhandler都用到了適配器模式
至此,我們總結一下
executor就是SqlSesson的一種實現,一種執行
跳到實現類中
然后executor可以進行對數據庫進行操作,對緩存進行處理,對事務進行操作,具體對數據庫的操作由statementhandler來做,通過parameterhandler進行參數處理,resultsethandler進行數據庫的返回,相關類型由typehandler來進行控制,statementhandler封裝了statement,resultsethandler封裝了resuletset,至此我們流程就通了
點進去
跳到實現類
進行重載
交給executor進行執行,點擊update方法繼續往下深入
至此我們這個流程算是完成了,和我們的結論一一印證了
我們為什么說第一種是代理設計模式呢,因為 UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
我們并沒有創建接口的實現類,但userDAO的確是一個子類,讓我們瞧瞧
這個動態代理如何實現的呢,我們下一節來講解