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>
根據MyBatis 的配置規範配置好後,通過SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 會根據相應的介面宣告的方法資訊,通過動態代理機制生成一個Mapper 例項,我們使用Mapper 介面的某一個方法時,MyBatis 會根據這個方法的方法名和引數型別,確定Statement Id,底層還是通過SqlSession.select("statementId",parameterObject);
SqlSession.getMapper(XXXMapper.class) ->Mapper例項->依據方法名、參數型別確定Statement ID->SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject);
MyBatis 引用Mapper 介面這種呼叫方式,純粹是為了滿足面向介面程式設計的需要。
2、資料處理層
資料處理層可以說是MyBatis 的核心,從大的方面上講,主要完成:(1)通過傳入引數構建動態SQL語句;(2)SQL語句的執行以及封裝查詢結果整合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)Configuration:MyBatis所有的配置資訊都維持在Configuration物件之中。
關係如圖:
參考部落格:https://blog.csdn.net/luanlouis/article/details/40422941