MyBatis原理-架構流程


一 、MyBatis原理架構圖 

 

 

Mybatis的功能架構分為三層:

  • API接口層:提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。
  • 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。
  • 基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的數據處理層提供最基礎的支撐。

 

二、MyBatis工作流程

 

 

 

 

1、 mybatis配置SqlMapConfig.xml,此文件作為mybatis的全局配置文件,配置了mybatis的運行環境等信息。
mapper.xml文件即sql映射文件,文件中配置了操作數據庫的sql語句。此文件需要在SqlMapConfig.xml中加載。

2、 通過mybatis環境等配置信息構造SqlSessionFactory即會話工廠

3、 由會話工廠創建sqlSession即會話,操作數據庫需要通過sqlSession進行。

4、 mybatis底層自定義了Executor執行器接口操作數據庫(CURD),Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。Executor才是真正將sql與Connection打交道的地方。在真正執行查詢時,外面是嵌套了一層CachingExecutor

 

首先,最底層的接口是Executor,有兩個實現類:BaseExecutor和CachingExecutor,CachingExecutor用於二級緩存,而BaseExecutor則用於一級緩存及基礎的操作。並且由於BaseExecutor是一個抽象類,提供了三個實現:SimpleExecutor,BatchExecutor,ReuseExecutor,而具體使用哪一個Executor則是可以在mybatis-config.xml中進行配置的。配置如下:
<settings>
    <!--SIMPLE、REUSE、BATCH-->
    <setting name="defaultExecutorType" value="REUSE"/>
</settings>

不開啟二級緩存

<settings>
        <setting name="cacheEnabled" value="false"/>
</settings>

通過configuration.newExecutor來獲取Executor

public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
    executorType = executorType == null ? defaultExecutorType : executorType;
    executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
    Executor executor;
    // 根據不同的executorType來創建
    if (ExecutorType.BATCH == executorType) {
      executor = new BatchExecutor(this, transaction);
    } else if (ExecutorType.REUSE == executorType) {
      executor = new ReuseExecutor(this, transaction);
    } else {
      executor = new SimpleExecutor(this, transaction);
    }
    // cacheEnabled 也就是我們配置的二級緩存,如果該值配置為true,則獲取的是CachingExecutor
    if (cacheEnabled) {
      executor = new CachingExecutor(executor);
    }
    // 這里是通過責任鏈模式來生成代理對象
    executor = (Executor) interceptorChain.pluginAll(executor);
    return executor;
}

  

5、 Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id即是Mapped statement的id(mapper.xml文件中的namespacce+id)。

6、 Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor通過 Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。

7、 Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor通過 Mapped Statement在執行sql后將輸出結果映射至java對象中,輸出結果映射過程相當於jdbc編程中對結果的解析處理過程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM