概述
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
背景介紹
MyBatis是支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java對象)映射成數據庫中的記錄。
每個MyBatis應用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預定義的配置類的實例獲得。
用xml文件構建SqlSessionFactory實例是非常簡單的事情。推薦在這個配置中使用類路徑資源(classpath resource),但你可以使用任何Reader實例,包括用文件路徑或file://開頭的url創(chuàng)建的實例。MyBatis有一個實用類----Resources,它有很多方法,可以方便地從類路徑及其它位置加載資源。
Mybatis緩存機制架構圖
一丶Mybaits一級緩存
mybatis的一級緩存:
MyBatis會在表示會話的SqlSession對象中建立一個簡單的緩存,將每次查詢到的結果結果緩存起來,
當下次查詢的時候,如果判斷先前有個完全一樣的查詢,會直接從緩存中直接將結果取出,返回給用戶,
不需要再進行一次數據庫查詢了。
MyBatis會在一次會話的表示----一個SqlSession對象中創(chuàng)建一個本地緩存(local cache),
對于每一次查詢,都會嘗試根據查詢的條件去本地緩存中查找是否在緩存中,如果在緩存中,
就直接從緩存中取出,然后返回給用戶;否則,從數據庫讀取數據,將查詢結果存入緩存并返回給用戶。
一級緩存是SqlSession級別的緩存。在操作數據庫時需要構造 sqlSession對象,在對象中有一個(內存區(qū)域)數據結構(HashMap)用于存儲緩存數據。不同的sqlSession之間的緩存數據區(qū)域(HashMap)是互相不影響的。
一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執(zhí)行相同的sql語句,第一次執(zhí)行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。當一個sqlSession結束后該sqlSession中的一級緩存也就不存在了。Mybatis默認開啟一級緩存。
二丶一級緩存原理
Mybatis的一級緩存是SqlSession級別的,我們知道每個mapper接口對應一個SqlSession(這樣說應該不準確,應該是一個線程中一個mapper接口對應一個sqlsession),所以Mybatis的一級緩存在不同mapper之間是隔離,相互不影響的。另外在執(zhí)行Add,Update,Del時候,會清空當前線程SqlSession的一級緩存避免臟讀。默認情況下mybaits開啟一級緩存。
Mybaits一級緩存結構圖:
三丶Mybatis二級緩存
二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession去操作數據庫得到數據會存在二級緩存區(qū)域,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執(zhí)行相同namespace下的sql語句且向sql中傳遞參數也相同即最終執(zhí)行相同的sql語句,第一次執(zhí)行完畢會將數據庫中查詢的數據寫到緩存(內存),第二次會從緩存中獲取數據將不再從數據庫查詢,從而提高查詢效率。Mybatis默認沒有開啟二級緩存需要在setting全局參數中配置開啟二級緩存。
二級緩存是namespace級別的,這個namespace就是指mapper文件里面那個namepsace,同一個namespace下的搜尋語句共享一個二級緩存。那么二級緩存是怎么樣的構造那,先看下一個圖:
原理
上CachingExecutor的查詢代碼如下:
如果開啟了二級緩存,則先從二級緩存中查找,查找不到則委托為SimpleExecutor查找,而它則會先從一級緩存中查找,查找不到則從數據庫查找。
總結
1、多寫多敲代碼,好的代碼與扎實的基礎知識一定是實踐出來的
2、可以去百度搜索騰訊課堂圖靈學院的直播課程來學習一下java架構實戰(zhàn)案例,還挺不錯的。
3丶Java開發(fā)/架構交流群:658706010我們一起討論技術,一起充電跟比你厲害的人在一起進步會更快哦
最后,每一位讀到這里的網友,感謝你們能耐心地看完。希望在成為一名更優(yōu)秀的Java程序員的道路上,我們可以一起