建構SqlSessionFactory過程
SqlSessionFactory是MyBatis的核心類之一,其最重要的功能就是提供建立MyBatis的核心接口SqlSession,是以
要先建立SqlSessionFactory,為此要提供配置檔案和相關的參數。
MyBatis采用Builder模式去建立SqlSessionFactory,在實際中通過SqlSessionFactoryBuilder去建構,分兩部:
-
通過 org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置的XML檔案,讀出所配置的參數,并将讀取的
内容存入org.apache.ibatis.session.Configuration類對象中。而Configuration采用的是單例模式,幾乎所有的
MyBatis配置内容都會存放在這個單例對象中,以便後續将這些内容讀出。
-
使用Configuration對象去建立SqlSessionFactory。MyBatis中的SqlSessionFactory是一個接口,而不是實作類,
為此MyBatis提供了一個預設的實作類org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。一般都不去建立新的實作類。
建構Configuration
它的作用:
讀入配置檔案,包括基礎配置的XML和映射器XML(或注解)。
初始化一些基礎配置,比如MyBatis的别名等,一些重要的類對象(比如插件、映射器、Object工廠、typeHandlers對象等)。
提供單例,為後續建立SessionFactory服務,提供配置的參數。
執行一些重要對象的初始化方法。
SqlSession運作過程
SqlSession也是一個接口,使用它并不複雜。它給出了查詢、插入、更新、删除的方法。它的執行過程是通過Executor、StatementHandler、ParameterHandler和ResultSetHandler來完成對資料庫操作和結果傳回的。
- Executor代表執行器,由它排程StatementHandler、ParameterHandler、ResultSetHandler等來執行對應的SQL。其中StatementHandler是最重要的。
- StatementHandler的作用是使用資料庫的Statement(PreparedStatement)執行操作,它是四大對象的核心,起到承上啟下的作用,許多重要的插件都是通過攔截它來實作的。
- ParamentHandler是用來處理SQL參數的。
- ResultSetHandler是進行資料集的封裝傳回處理的,它相當複雜,好在我們不常用它。
執行過程:MyBatis根據Configuration來建構StatementHandler,然後使用prepareStatement方法,對SQL編譯和參數初始化。
實作過程:它調用了StatementHandler的prepare()進行了預編譯和基礎的設定,然後通過StatementHandler的parameterize()來設定參數,最後使用StatementHandler的query方法,把ResultHandler傳遞進去,使用它的組織結果傳回給調用者來完成一次查詢。
Executor 執行器
SqlSession其實是一個門面,正真幹活的是執行器,它是一個真正執行Java和資料庫互動的對象,是以它十分的重要。
MyBatis中有3中執行器。我們可以在MyBatis的配置檔案中進行選擇。
(1)SIMPLE:簡易執行器,它沒有什麼特别的,不配置它就使用預設執行器。
(2)REUSE:它是一種能夠執行重用預處理語句的執行器。
(3)BATCH:執行器重用語句和批量更新,批量專用的執行器。
StatementHandler 資料庫會話器
它是專門處理資料庫會話的。
一條查詢SQL的執行過程:
Executor先調用StatementHandler的prepare()方法預編譯SQL,同時設定一些基本運作的參數。然後用paramerize()方法啟用ParameterHandler設定參數,完成預編譯,執行查詢。MyBatis會使用ResultSetHandler封裝結果傳回給調用者。
ParamenterHanlder 參數處理器
MyBatis通過ParamenterHandler對預編譯語句進行參數設定的,它的作用是完成對預處理編譯參數的設定,它的作用是完成對預編譯的設定,它的接口中有兩個方法:
(1)Object getParamenterObject(); 作用:傳回參數對象
(2)void setParameters(PreparedStatement ps) throws SQLException;
作用:設定預編譯SQL語句的參數。同時它還有一個實作類:DefaultParamenterHandler,其中setParameters的方法中大體就是:
從parameterObject對象中取到參數,然後使用typeHandler轉換參數,如果沒設定,那麼它會根據簽名注冊的typeHandler對象參數進行處理。而typeHandler也是MyBatis初始化時,注冊在Configuration裡面的,需要時就可以直接拿來用了,MyBatis是通過這樣來完成參數配置的。
ResultSetHandler 結果集處理器
實作類DefaultResultSetHandler。
其接口中的兩個方法:
List handleResultSets(Statement stmt) throws SQLException;
void handleOutputParameters(CallableStatement cs) throws SQLException;
handleOutputParameters:處理存儲過程輸出參數的。
handleResultSets:它是包裝結果集的。
SqlSession總結:
由Executor排程StatementHandler來運作。
StatementHandler分散步:
(1)prepared預編譯SQL。
(2)paramerize設定參數。
(3)query/update執行SQL。
paramerize是調用ParamenterHandler的方法設定的,而參數是根據類型處理器typeHandler處理的。