mybatis功能架構及執行流程

1、功能架構設計java

mybatis架構.PNG

功能架構講解:sql

咱們把Mybatis的功能架構分爲三層:數據庫

(1) API接口層:提供給外部使用的接口API,開發人員經過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。編程

MyBatis和數據庫的交互有兩種方式:api

a.使用傳統的MyBatis提供的API緩存

b. 使用Mapper接口mybatis

a1.使用傳統的MyBatis提供的API架構

這是傳統的傳遞Statement Id 和查詢參數給 SqlSession 對象,使用 SqlSession對象完成和數據庫的交互;MyBatis 提供了很是方便和簡單的API,供用戶實現對數據庫的增刪改查數據操做,以及對數據庫鏈接信息和MyBatis 自身配置信息的維護操做。app

                   圖片1.png

      上述使用MyBatis 的方法,是建立一個和數據庫打交道的SqlSession對象,而後根據Statement Id 和參數來操做數據庫,這種方式當然很簡單和實用,可是它不符合面嚮對象語言的概念和麪向接口編程的編程習慣。因爲面向接口的編程是面向對象的大趨勢,MyBatis 爲了適應這一趨勢,增長了第二種使用MyBatis 支持接口(Interface)調用方式。框架

1.2. 使用Mapper接口

 MyBatis 將配置文件中的每個<mapper> 節點抽象爲一個 Mapper 接口,而這個接口中聲明的方法和跟<mapper> 節點中的<select|update|delete|insert> 節點項對應,即<select|update|delete|insert> 節點的id值爲Mapper 接口中的方法名稱,parameterType 值表示Mapper 對應方法的入參類型,而resultMap 值則對應了Mapper 接口表示的返回值類型或者返回結果集的元素類型。

圖片2.png

 根據MyBatis 的配置規範配置好後,經過SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 會根據相應的接口聲明的方法信息,經過動態代理機制生成一個Mapper 實例,咱們使用Mapper 接口的某一個方法時,MyBatis 會根據這個方法的方法名和參數類型,肯定Statement Id,底層仍是經過SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject); 等等來實現對數據庫的操做

MyBatis 引用Mapper 接口這種調用方式,純粹是爲了知足面向接口編程的須要。(其實還有一個緣由是在於,面向接口的編程,使得用戶在接口上可使用註解來配置SQL語句,這樣就能夠脫離XML配置文件,實現「0配置」)。

 

(2) 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操做。

 (2.1).參數映射和動態SQL語句生成

       動態語句生成能夠說是MyBatis框架很是優雅的一個設計,MyBatis 經過傳入的參數值,使用 Ognl 來動態地構造SQL語句,使得MyBatis有很強的靈活性和擴展性。

參數映射指的是對於java 數據類型和jdbc數據類型之間的轉換:這裏有包括兩個過程:查詢階段,咱們要將java類型的數據,轉換成jdbc類型的數據,經過 preparedStatement.setXXX() 來設值;另外一個就是對resultset查詢結果集的jdbcType 數據轉換成java 數據類型。

       (2.2). SQL語句的執行以及封裝查詢結果集成List<E>

            動態SQL語句生成以後,MyBatis 將執行SQL語句,並將可能返回的結果集轉換成List<E> 列表。MyBatis 在對結果集的處理中,支持結果集關係一對多和多對一的轉換,而且有兩種支持方式,一種爲嵌套查詢語句的查詢,還有一種是嵌套結果集的查詢。

 

(3)基礎支撐層:負責最基礎的功能支撐,包括鏈接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來做爲最基礎的組件。爲上層的數據處理層提供最基礎的支撐。

2、mybatis執行流程

 

1. 加載配置文件並初始化(SqlSession)

配置文件來源於兩個地方,一個是配置文件(主配置文件conf.xml,mapper文件*.xml),一個是java代碼中的註釋,將sql的配置信息加載成爲一個mappedstatement對象,存儲在內存之中(包括傳入參數的映射配置,結果映射配置,執行的sql語句)。

2. 接收調用請求

調用mybatis提供的api,傳入的參數爲sqlid(有namespase和具體sqlid組成)和sql語句的參數對象,mybatis將調用請求交給請求處理層。

3. 處理請求

根據sqlid找到對應的mappedstatament對象。

根據傳入參數解析mappedstatement對象,獲得最終要執行的sql

獲取數據庫鏈接,執行sql,獲得執行結果

Mappedstatement對象中的結果映射對執行結果進行轉換處理,並獲得最終的處理結果。

釋放鏈接資源

4. 返回處理結果

相關文章
相關標籤/搜索