基礎
定義:
MyBatis 與 Hibernate 相似,都是持久層框架 ,而 MyBatis 是一款 半自動 ORM 工具(object relation mapping) ,其優點有:
- 解除 SQL與程式代碼的耦合
- 支持撰寫動態 SQL 陳述句
其缺點有:
- SQL 陳述句的撰寫作業量較大
- SQL 陳述句依賴于資料庫,導致資料庫移植性差,不能隨意更換資料庫
作業流程:

-
讀取全域組態檔,例如資料庫連接資訊等;加載 SQL 映射檔案,
-
構造 SqlSessionFactory
-
創建 SqlSession:由 SqlSessionFactory 創建 SqlSession 物件,該物件中包含了執行 SQL 陳述句的所有方法,
-
Executor 執行器:MyBatis 底層定義了一個 Executor 介面來操作資料庫,它將根據 SqlSession 傳遞的引數(simple / reuse / batch三類)動態地生成需要執行的 SQL 陳述句,同時負責查詢快取的維護,
-
MappedStatement :在 Executor 的執行方法中有一個 MappedStatement 型別的引數,該引數是對映射資訊的封裝,用于存盤映射的 SQL 陳述句的 id、引數資訊等,
映射檔案中每條 SQL 都對應一個 MappedStatement,使用類的全限定名 + 方法名做 MappedStatement 的唯一標識(由此可知介面中不能有方法多載) -
輸入引數映射:輸入引數型別可以是 Map、List 等集合型別,也可以是基本資料型別和 POJO 型別,
-
輸出結果映射:輸出結果型別可以是 Map、 List 等集合型別,也可以是基本資料型別和 POJO 型別,
介面與映射檔案間的作業原理:
?? Mybatis 運行時使用 JDK 動態代理為 Dao 介面生成代理物件,攔截介面方法,找到 SQL 標簽對應的 MappedStatement 執行,然后將執行結果回傳,
動態SQL
?? 在 Xml 映射檔案中,以標簽的形式動態拼接 SQL ,Mybatis 提供了9種動態 SQL 標簽:
trim | where | set | foreach | if | choose | when | otherwise | bind
MyBatis 本地的一、二級快取
一級快取
一級快取的使用流程:

一級快取的使用
?? 如何使用MyBatis一級快取?開發者只需在MyBatis的組態檔中,添加如下陳述句,就可以使用一級快取,共有兩個選項,SESSION或者STATEMENT,默認是SESSION級別,即在一個 SqlSession 中執行的所有陳述句,都會共享這一個快取,一種是STATEMENT級別,可以理解為快取只對當前執行的這一個 Statement 有效,
<setting name="localCacheScope" value="SESSION"/>
關于原始碼與用例可參考本文,對于一級快取我們需要知道的結論:
-
MyBatis 一級快取的生命周期和 SqlSession 一致,SqlSession 內的資料修改操作,會重繪快取,
-
MyBatis 一級快取內部設計簡單,只是一個沒有容量限定的 HashMap,在快取的功能性上有所欠缺,
-
MyBatis 的一級快取最大范圍是 SqlSession 內部,有多個 SqlSession(即分布式環境下)時,資料庫寫操作會引起臟資料,
與 Spring 整合后的一級快取
關于原始碼與用例可參考本文,總結后可得到如下結論:
-
在未開啟事務的情況下,每個資料庫操作,Spring 都會構建一個新的 SqlSession 出來,所以也無法使用到對應的本地一級快取,
-
在同一個事務中,每個資料庫操作,Spring 都回傳同一個 SqlSession,所以可以使用到一級快取,
二級快取
?? 默認關閉,實作了 SqlSession 之間快取資料的共享,但仍然屬于本地快取,不適用于分布式環境,且有一定開發成本,使用 Redis 等一些中間件更合適些,
官方檔案
??
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263400.html
標籤:其他
上一篇:70對600如何打贏
