MyBatis的架構設計分析

MyBatis是目前很是流行的ORM框架,它的功能很強大,然而其實現卻比較簡單、優雅。本文主要講述MyBatis的架構設計思路,而且討論MyBatis的幾個核心部件,來探究MyBatis的實現。
MyBatis的架構設計分析
1.接口層---和數據庫交互的方式1.1.使用傳統的MyBatis提供的API
這是傳統的傳遞Statement Id 和查詢參數給 SqlSession 對象,使用 SqlSession對象完成和數據庫的交互;MyBatis 提供了很是方便和簡單的API,供用戶實現對數據庫的增刪改查數據操做,以及對數據庫鏈接信息和MyBatis 自身配置信息的維護操做。
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的架構設計分析
根據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 會直接將緩存結果返回給用戶,而不用再到數據庫中查找。java

    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的架構設計分析
相關文章
相關標籤/搜索