天天看點

MyBatis 運作原理

​建構SqlSessionFactory過程​

SqlSessionFactory是MyBatis的核心類之一,其最重要的功能就是提供建立MyBatis的核心接口SqlSession,是以

要先建立SqlSessionFactory,為此要提供配置檔案和相關的參數。

MyBatis采用Builder模式去建立SqlSessionFactory,在實際中通過SqlSessionFactoryBuilder去建構,分兩部:

  1. 通過 org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置的XML檔案,讀出所配置的參數,并将讀取的

    内容存入org.apache.ibatis.session.Configuration類對象中。而Configuration采用的是單例模式,幾乎所有的

    MyBatis配置内容都會存放在這個單例對象中,以便後續将這些内容讀出。

  2. 使用Configuration對象去建立SqlSessionFactory。MyBatis中的SqlSessionFactory是一個接口,而不是實作類,

    為此MyBatis提供了一個預設的實作類org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。一般都不去建立新的實作類。

​建構Configuration​

它的作用:

讀入配置檔案,包括基礎配置的XML和映射器XML(或注解)。

初始化一些基礎配置,比如MyBatis的别名等,一些重要的類對象(比如插件、映射器、Object工廠、typeHandlers對象等)。

提供單例,為後續建立SessionFactory服務,提供配置的參數。

執行一些重要對象的初始化方法。

​SqlSession運作過程​

SqlSession也是一個接口,使用它并不複雜。它給出了查詢、插入、更新、删除的方法。它的執行過程是通過Executor、StatementHandler、ParameterHandler和ResultSetHandler來完成對資料庫操作和結果傳回的。

  1. Executor代表執行器,由它排程StatementHandler、ParameterHandler、ResultSetHandler等來執行對應的SQL。其中StatementHandler是最重要的。
  2. StatementHandler的作用是使用資料庫的Statement(PreparedStatement)執行操作,它是四大對象的核心,起到承上啟下的作用,許多重要的插件都是通過攔截它來實作的。
  3. ParamentHandler是用來處理SQL參數的。
  4. 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處理的。