1. 程式人生 > >Mybatis框架原理解析

Mybatis框架原理解析

一、Mybatis的架構設計

框架分為四層:介面層、資料處理層、框架支撐層、引導層。

介面層呼叫方式:基於Statement ID、基於Mapper介面

資料處理層:引數對映(parameterHandler)、SQL解析(SqlSource)、SQL執行(Ececutor)、結果處理及對映(ResultSetHandler)。

框架支撐層:連線池管理、SQL語句配置方法(基於XML配置、基於註解)、事務管理、快取機制。

引導層:基於XML配置方式、基於java API方式。

1、介面層(和資料庫的互動方式)

MyBatis和資料庫的互動有兩種方式:

a.使用傳統的MyBatis提供的API;

b. 使用Mapper介面;

1.1使用傳統Mybatis提供API

建立SqlSession物件(與資料庫互動),傳入Statement Id、parameterObject引數,依據非常方便和簡單的API,供使用者實現對資料庫的增刪改查資料操作,以及對資料庫連線資訊和MyBatis 自身配置資訊的維護操作。

1.2使用Mapper介面

 MyBatis 將配置檔案中的每一個<mapper> 節點抽象為一個 Mapper 介面,而這個介面中宣告的方法和跟<mapper> 節點中的<select|update|delete|insert> 節點項對應,即<select|update|delete|insert>

節點的id值為Mapper 介面中的方法名稱,parameterType 值表示Mapper 對應方法的入參型別,而resultMap 值則對應了Mapper 介面表示的返回值型別或者返回結果集的元素型別。

 根據MyBatis 的配置規範配置好後,通過SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 會根據相應的介面宣告的方法資訊,通過動態代理機制生成一個Mapper 例項,我們使用Mapper 介面的某一個方法時,MyBatis 會根據這個方法的方法名和引數型別,確定Statement Id,底層還是通過SqlSession.select("statementId",parameterObject);

或者SqlSession.update("statementId",parameterObject); 等等來實現對資料庫的操作

SqlSession.getMapper(XXXMapper.class) ->Mapper例項->依據方法名、參數型別確定Statement ID->SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject);

MyBatis 引用Mapper 介面這種呼叫方式,純粹是為了滿足面向介面程式設計的需要。

2、資料處理層

資料處理層可以說是MyBatis 的核心,從大的方面上講,主要完成:(1通過傳入引數構建動態SQL語句;2SQL語句的執行以及封裝查詢結果整合List<E>

2.1 引數對映和動態SQL語句生成

引數對映指的是對於java 資料型別和jdbc資料型別之間的轉換:這裡有包括兩個過程:查詢階段,我們要將java型別的資料,轉換成jdbc型別的資料,通過 preparedStatement.setXXX() 來設值;另一個就是對resultset查詢結果集的jdbcType 資料轉換成java 資料型別。

動態語句生成可以說是MyBatis框架非常優雅的一個設計,MyBatis 通過傳入的引數值,使用 Ognl 來動態地構造SQL語句,使得MyBatis 有很強的靈活性和擴充套件性。

2.2 SQL語句的執行以及封裝查詢結果整合List<E>

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

3、框架支撐層

3.1連線池管理機制

由於建立一個數據庫連線所佔用的資源比較大, 對於資料吞吐量大和訪問量非常大的應用而言,連線池的設計就顯得非常重要,對於連線池管理機制

3.2 SQL語句的配置方式(註解配置SQL語句)

傳統的MyBatis 配置SQL 語句方式就是使用XML檔案進行配置的,但是這種方式不能很好地支援面向介面程式設計的理念,為了支援面向介面的程式設計,MyBatis 引入了Mapper介面的概念,面向介面的引入,對使用註解來配置SQL 語句成為可能,使用者只需要在介面上新增必要的註解即可,不用再去配置XML檔案了,但是,目前的MyBatis 只是對註解配置SQL 語句提供了有限的支援,某些高階功能還是要依賴XML配置檔案配置SQL 語句。

3.3 事務管理機制

事務管理機制對於ORM框架而言是不可缺少的一部分,事務管理機制的質量也是考量一個ORM框架是否優秀的一個標準

3.4 快取機制

為了提高資料利用率和減小伺服器和資料庫的壓力,MyBatis 會對於一些查詢提供會話級別的資料快取,會將對某一次查詢,放置到SqlSession 中,在允許的時間間隔內,對於完全相同的查詢,MyBatis 會直接將快取結果返回給使用者,而不用再到資料庫中查詢。

4、引導層

引導層是配置和啟動MyBatis 配置資訊的方式。MyBatis 提供兩種方式來引導MyBatis :基於XML配置檔案的方式和基於Java API 的方式。

二、Mybatis主要構件及關聯關係

MyBatis程式碼實現的角度來看,MyBatis的主要的核心部件有以下幾個:

(1)SqlSession:作為MyBatis工作的主要頂層API,表示和資料庫互動的會話,完成必要資料庫增刪改查功能。

(2)Executor:MyBatis執行器,是MyBatis 排程的核心,負責SQL語句的生成和查詢快取的維護

(3)StatementHandler:封裝了JDBC Statement操作,負責對JDBC statement 的操作,如設定引數、將Statement結果集轉換成List集合。

(4)ParameterHandler:負責對使用者傳遞的引數轉換成JDBC Statement 所需要的引數,

(5)ResultSetHandler:負責將JDBC返回的ResultSet結果集物件轉換成List型別的集合;

(6)TypeHandler:負責java資料型別和jdbc資料型別之間的對映和轉換。

(7)MappedStatement:維護了一條<select|update|delete|insert>節點的封裝。

(8)SqlSource:負責根據使用者傳遞的parameterObject,動態地生成SQL語句,將資訊封裝到BoundSql物件中,並返回。

(9)BoundSql:表示動態生成的SQL語句以及相應的引數資訊。

(10)ConfigurationMyBatis所有的配置資訊都維持在Configuration物件之中。

關係如圖:

 

參考部落格:https://blog.csdn.net/luanlouis/article/details/40422941