1. 程式人生 > >MyBatis的架構設計分析

MyBatis的架構設計分析

SQ In 功能 返回 sta 自身 water DC 入參

MyBatis是目前非常流行的ORM框架,它的功能很強大,然而其實現卻比較簡單、優雅。本文主要講述MyBatis的架構設計思路,並且討論MyBatis的幾個核心部件,來探究MyBatis的實現。
技術分享圖片
1.接口層---和數據庫交互的方式
1.1.使用傳統的MyBatis提供的API
這是傳統的傳遞Statement Id?和查詢參數給?SqlSession?對象,使用?SqlSession對象完成和數據庫的交互;MyBatis?提供了非常方便和簡單的API,供用戶實現對數據庫的增刪改查數據操作,以及對數據庫連接信息和MyBatis?自身配置信息的維護操作。
? ? ? ? ? ?技術分享圖片 ?? ????
????? 上述使用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?接口表示的返回值類型或者返回結果集的元素類型。
技術分享圖片
根據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.數據處理層
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.框架支撐層
3.1. 事務管理機制
事務管理機制對於ORM框架而言是不可缺少的一部分,事務管理機制的質量也是考量一個ORM框架是否優秀的一個標準。
3.2. 連接池管理機制
由於創建一個數據庫連接所占用的資源比較大, 對於數據吞吐量大和訪問量非常大的應用而言,連接池的設計就顯得非常重要。
3.3. 緩存機制
為了提高數據利用率和減小服務器和數據庫的壓力,MyBatis?會對於一些查詢提供會話級別的數據緩存,會將對某一次查詢,放置到SqlSession中,在允許的時間間隔內,對於完全相同的查詢,MyBatis?會直接將緩存結果返回給用戶,而不用再到數據庫中查找。

    1. SQL語句的配置方式
      傳統的MyBatis?配置SQL?語句方式就是使用XML文件進行配置的,但是這種方式不能很好地支持面向接口編程的理念,為了支持面向接口的編程,MyBatis?引入了Mapper接口的概念,面向接口的引入,對使用註解來配置SQL?語句成為可能,用戶只需要在接口上添加必要的註解即可,不用再去配置XML文件了,但是,目前的MyBatis?只是對註解配置SQL?語句提供了有限的支持,某些高級功能還是要依賴XML配置文件配置SQL?語句。
      4.引導層
      引導層是配置和啟動MyBatis?配置信息的方式。MyBatis?提供兩種方式來引導MyBatis?:基於XML配置文件的方式和基於Java API?的方式。????
      5.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對象中,並返回BoundSql表示動態生成的SQL語句以及相應的參數信息
9).Configuration:MyBatis所有的配置信息都維持在Configuration對象之中。

它們的關系如下圖所示:
技術分享圖片

MyBatis的架構設計分析