1. 程式人生 > >ORM框架之MyBatis

ORM框架之MyBatis

一、MyBatis 介紹

1. MyBatis 基礎說明

(1)MyBatis是一個支援普通SQL查詢,儲存過程和高階對映的優秀持久層框架。

(2)MyBatis消除了幾乎所有的JDBC程式碼和引數的手工設定以及對結果集的檢索封裝。

(3)MyBatis可以使用簡單的XML或註解用於配置和原始對映,將介面和Java的POJO(Plain Old Java Objects,普通的Java物件)對映成資料庫中的記錄。

2. MyBatis 和 iBatis

(1)MyBatis 本是apache的一個開源專案iBatis, 2010年這個專案由apache software foundation 遷移到了google code,並且改名為MyBatis。iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。

(2)MyBatis是iBatis的升級版,用法有很多的相似之處,但是MyBatis進行了重要的改進。主要表現在以下幾個方面:

      1)Mybatis實現了介面繫結,使用更加方便。

      2)物件關係對映的改進,效率更高

      3)MyBatis採用功能強大的基於OGNL的表示式來消除其他元素。

3. MyBatis特點

3.1  MyBatis優點

(1)簡單易學

mybatis本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar檔案+配置幾個sql對映檔案易於學習,易於使用,通過文件和原始碼,可以比較完全的掌握它的設計思路和實現。

(2)靈活

mybatis不會對應用程式或者資料庫的現有設計強加任何影響。 sql寫在xml裡,便於統一管理和優化。通過sql基本上可以實現我們不使用資料訪問框架可以實現的所有功能,或許更多。

(3)解除sql與程式程式碼的耦合

通過提供DAL層,將業務邏輯和資料訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和程式碼的分離,提高了可維護性。

(4)提供對映標籤,支援物件與資料庫的orm欄位關係對映

(5)提供物件關係對映標籤,支援物件關係組建維護

(6)提供xml標籤,支援編寫動態sql。

3.2 MyBatis缺點

(1)編寫SQL語句時工作量很大,尤其是欄位多、關聯表多時,更是如此。

(2)SQL語句依賴於資料庫,導致資料庫移植性差,不能更換資料庫。

(3)框架還是比較簡陋,功能尚有缺失,雖然簡化了資料繫結程式碼,但是整個底層資料庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速資料庫修改。

(4)二級快取機制不佳

4.  MyBatis總結

(1)mybatis的優點同樣是mybatis的缺點,正因為mybatis使用簡單,資料的可靠性、完整性的瓶頸便更多依賴於程式設計師對sql的使用水平上了。sql寫在xml裡,雖然方便了修改、優化和統一瀏覽,但可讀性很低,除錯也非常困難,也非常受限。

(2)mybatis沒有hibernate那麼強大,但是mybatis最大的優點就是簡單小巧易於上手,方便瀏覽修改sql語句。

二、MyBatis 原理分析

1. MyBatis 功能架構

1.1 MyBatis 功能結構圖

功能結構

1.2 MyBatis 功能結構說明

(1)API介面層:提供給外部使用的介面API,開發人員通過這些本地API來操縱資料庫。介面層一接收到呼叫請求就會呼叫資料處理層來完成具體的資料處理。

(2)資料處理層:負責具體的SQL查詢、SQL解析、SQL執行執行結果對映處理等。它主要的目的是根據呼叫的請求完成一次資料庫操作。

(3)基礎支撐層:負責最基礎的功能支撐,包括連線管理、事務管理、配置載入、快取處理,這些都是共用的東西,將他們抽取出來作為最基礎的元件。為上層的資料處理層提供最基礎的支撐。

2. MyBatis 執行流程

資料處理流程

2.1 載入配置並初始化

需要載入配置檔案,其中配置檔案主要來自於開發者自定義的配置檔案或者存在於Java程式碼中的註解,SQL的配置資訊載入成為一個個MappedStatement物件(包括了傳入引數對映配置、執行的SQL語句、結果對映配置),儲存在記憶體中。

2.2 接受呼叫請求

呼叫Mybatis提供的API,為指定的SQL ID傳入引數物件,然後將請求傳遞給下層的請求處理層進行處理。

2.3 處理操作請求

API介面層傳遞請求過來,為指定的SQL ID傳入引數物件,接著會進行如下一系列操作處理:

(1) 根據SQL的ID查詢對應的MappedStatement物件。

(2) 根據傳入引數物件解析MappedStatement物件,得到最終要執行的SQL和執行傳入引數。

(3) 獲取資料庫連線,根據得到的最終SQL語句和執行傳入引數到資料庫執行,並得到執行結果。

(4) 根據MappedStatement物件中的結果對映配置對得到的執行結果進行轉換處理,並得到最終的處理結果。

(5) 釋放連線資源。

2.4 返回處理結果

將最終的操作處理結果返回給使用者請求操作。

三、MyBatis 開發應用

1. 獲取操作Session

操作Session

2. 資料操作

2.1 XML 配置處理

(1) Mybatis 配置核心

核心配置檔案

(2) 功能介面配置

SQL操作配置

(2) 測試

資料操作

2.2 註解實現

在註解上不能直接使用動態的SQL,需要在其前後加入;

對於LIKE 也是不能夠直接使用的 可以藉助concat函式實現;

(1) 功能介面配置

註解操作

(2) 測試

資料操作

 

四、MyBatis 補充說明

1. Mybatis 一級快取

1.1 概念說明

(1)MyBatis會在表示會話的SqlSession物件中建立一個簡單的快取,將每次查詢到的結果結果快取起來,當下次查詢的時候,判斷先前有個完全一樣的查詢,會直接從快取中直接將結果取出,返回給使用者,不需要再進行一次資料庫查詢了。

(2)一個SqlSession物件中建立一個本地快取(local cache),對於每一次查詢,都會嘗試根據查詢的條件去本地快取中查詢是否在快取中,如果在快取中,就直接從快取中取出,然後返回給使用者;否則,從資料庫讀取資料,將查詢結果存入快取並返回給使用者。

(3)由於MyBatis使用SqlSession物件表示一次資料庫的會話,那麼,對於會話級別的一級快取也應該是在SqlSession中控制的。

(4)SqlSession只是一個MyBatis對外的介面,SqlSession將它的工作交給了Executor執行器這個角色來完成,負責完成對資料庫的各種操作。

(5)當建立了一個SqlSession物件時,MyBatis會為這個SqlSession物件建立一個新的Executor執行器,而快取資訊就被維護在這個Executor執行器中,MyBatis將快取和對快取相關的操作封裝成了Cache介面中。

(6)Executor介面的實現類BaseExecutor中擁有一個Cache介面的實現類PerpetualCache,則對於BaseExecutor物件而言,它將使用PerpetualCache物件維護快取。

(7)由於Session級別的一級快取實際上就是使用PerpetualCache維護的。PerpetualCache實現原理其實很簡單,其內部就是通過一個簡單的HashMap 來實現的,沒有其他的任何限制。

1.2 生命週期

(1)MyBatis在開啟一個數據庫會話時,會建立一個新的SqlSession物件,SqlSession物件中會有一個新的Executor物件,Executor物件中持有一個新的PerpetualCache物件;當會話結束時,SqlSession物件及其內部的Executor物件還有PerpetualCache物件也一併釋放掉。

(2)如果SqlSession呼叫了close()方法,會釋放掉一級快取PerpetualCache物件,一級快取將不可用;

(3)如果SqlSession呼叫了clearCache(),會清空PerpetualCache物件中的資料,但是該物件仍可使用;

(4)SqlSession中執行了任何一個update操作(update()、delete()、insert()),都會清空PerpetualCache物件的資料,但是該物件可以繼續使用;

1.3 工作流程

快取應用流程

1.4 功能總結

(1)MyBatis對會話(Session)級別的一級快取設計的比較簡單,就簡單地使用了HashMap來維護,並沒有對HashMap的容量和大小進行限制,其主要原因:

        1)一般而言SqlSession的生存時間很短。一般情況下使用一個SqlSession物件執行的操作                不會太多,執行完就會消亡;

        2)對於某一個SqlSession物件而言,只要執行update操作(update、insert、delete),都              會將這個SqlSession物件中對應的一級快取清空掉,所以一般情況下不會出現快取過                  大,影響JVM記憶體空間的問題;

        3)可以手動地釋放掉SqlSession物件中的快取。

(2)一級快取是一個粗粒度的快取,沒有更新快取和快取過期的概念,MyBatis的一級快取就是使用了簡單的HashMap,MyBatis只負責將查詢資料庫的結果儲存到快取中去,不會去判斷快取存放的時間是否過長、是否過期,因此也就沒有對快取的結果進行更新這一說了。

2. Mybatis 二級快取

2.1 概念說明

(1)MyBatis的二級快取是Application級別的快取,它可以提高對資料庫查詢的效率,以提高應用的效能。

(2)MyBatis使用了二級快取,並且Mapper和select語句也配置使用了二級快取,那麼在執行select查詢的時候,MyBatis會先從二級快取中取輸入,其次才是一級快取,即MyBatis查詢資料的順序是:二級快取———>一級快取——>資料庫。

2.2 二級快取的劃分

(1)MyBatis並不是簡單地對整個Application就只有一個Cache快取物件,它將快取劃分的更細,即是Mapper級別的,每一個Mapper都可以擁有一個Cache物件為每一個Mapper分配一個Cache快取物件(使用節點配置)

(2)MyBatis將Application級別的二級快取細分到Mapper級別,即對於每一個Mapper.xml,如果在其中使用了節點,則MyBatis會為這個Mapper建立一個Cache快取物件。

(3)多個Mapper共用一個Cache快取物件(使用節點配置)節點,來指定你的這個Mapper使用到了哪一個Mapper的Cache快取。

(4)要想使某條Select查詢支援二級快取,需要保證:

        1)MyBatis支援二級快取的總開關:全域性配置變數引數cacheEnabled=true;

        2)該select語句所在的Mapper,配置了或節點,並且有效;

        3)該select語句的引數useCache=true;

2.3 二級快取實現

(1)MyBatis對二級快取的設計非常靈活,它自己內部實現了一系列的Cache快取實現類,並提供了各種快取重新整理策略如LRU,FIFO等等。

(2)MyBatis還允許使用者自定義Cache介面實現,使用者是需要實現org.apache.ibatis.cache.Cache介面,然後將Cache實現類配置在節點的type屬性上即可;除此之外,MyBatis還支援跟第三方記憶體快取庫如Memecached的整合,總之,使用MyBatis的二級快取有三個選擇:

      1)MyBatis自身提供的快取實現;

      2)使用者自定義的Cache介面實現;

      3)跟第三方記憶體快取庫的整合;

3. MyBatis 外掛

3.1 概念說明

(1) Mybatis外掛又稱攔截器,採用責任鏈模式,通過動態代理組織多個外掛(攔截器),這些外掛可以改變Mybatis的預設行為(諸如SQL重寫之類的),由於外掛會深入到Mybatis的核心,因此在編寫自己的外掛前最好了解下它的原理,以便寫出安全高效的外掛。

(2)MyBatis 允許你在已對映語句執行過程中的某一點進行攔截呼叫。

(3)Mybatis是通過動態代理的方式實現攔截的。

3.2 開發原則

(1)不編寫不必要的外掛。

(2)實現plugin方法時判斷一下目標型別,是本外掛要攔截的物件才執行Plugin.wrap方法,否者直接返回目標本省,這樣可以減少目標被代理的次數。

(3)所有可能被攔截的處理類都會生成一個代理

(4)處理類代理在執行對應方法時,判斷要不要執行外掛中的攔截方法

(5)執行插接中的攔截方法後,推進目標的執行

(6)如果有N個外掛,就有N個代理,每個代理都要執行上面的邏輯。這裡面的層層代理要多次生成動態代理,是比較影響效能的。雖然能指定外掛攔截的位置,但這個是在執行方法時動態判斷,初始化的時候就是簡單的把外掛包裝到了所有可以攔截的地方。

3.3 功能實現

Mybatis的外掛實現要實現 Interceptor 介面,介面的方法主要功能如下:

(1)setProperties方法,在Mybatis進行配置外掛的時候可以配置自定義相關屬性,即:介面實現物件的引數配置

(2)plugin方法,外掛用於封裝目標物件的,通過該方法我們可以返回目標物件本身,也可以返回一個它的代理,可以決定是否要進行攔截進而決定要返回一個什麼樣的目標物件,官方提供了示例:return Plugin.wrap(target, this);

(3)intercept方法,進行攔截的時候要執行的方法

(4)plugin介面,(Executor/ParameterHandler/ResultSetHander/StatementHandler)的代理物件。在呼叫對應物件的介面的時候,可以進行攔截並處理。返回引數target物件。

五、MyBatis 知識點

MyBatis 知識點



作者:雲先生_2017
連結:https://www.jianshu.com/p/4fe280c44294
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。