Java面試-框架篇-Mybatis
- MyBatis執行流程
- 延遲加載使用及原理
- 一, 二級緩存
- 來源
MyBatis執行流程
- 讀取MyBatis配置文件: mybatis-config.xml加載運行環境和映射文件
- 構造會話工廠SqlSessionFactory
- 會話工廠創建SqlSession對象(包含了執行SQL語句的所有方法)
- 操作數據庫的接口, Executor執行器, 同時負責查詢緩存的維護
- Executor接口的執行方法中有一個MappedStatement類型的參數, 封裝了映射信息
- 輸入參數映射
- 輸出結果映射
延遲加載使用及原理
-
Mybatis是否支持延遲加載
- 延遲加載: 需要用到數據時才進行加載, 不需要用到數據時就不加載數據
- Mybatis支持一對一關聯對象和一對多關聯集合對象的延遲加載
- 在Mybatis配置文件中, 可以配置是否啟用延遲加載
lazyLoadingEnabled=true|false
, 默認是關閉的
-
延遲加載的底層原理
- 使用CGLIB創建目標對象的代理對象
- 當調用目標方法時, 進入攔截器invoke方法, 發現目標方法是null值, 執行sql查詢
- 獲取數據以后, 調用set方法設置屬性值, 再繼續查詢目標方法, 就有值了
一, 二級緩存
- Mybatis的一級, 二級緩存
- 一級緩存: 基于PerpetualCache的HashMap本地緩存, 其存儲作用域為SqlSession, 當SqlSession進行flush或close之后, 該Session中的所有Cache就將清空, 默認打開一級緩存
- 二級緩存: 基于namespace和mapper的作用域起作用的, 不是依賴于SqlSession, 默認也是用PerpetualCache, HashMap存儲. 需要單獨開啟, 一個是核心配置開啟
cacheEnabled
, 一個是mapper映射文件添加<cache/>
- 二級緩存注意事項
- 二級緩存需要緩存的數據實現Serializable接口
- 只有會話提交或者關閉以后, 一級緩存中的數據才會轉移到二級緩存中
- Mybatis的二級緩存什么時候會清理緩存中的數據
- 當某一個作用域(一級緩存Session/二級緩存Namespaces)的進行了新增, 修改, 刪除操作后, 默認該作用域下所有select的緩存將被clear
來源
黑馬程序員. 新版Java面試專題視頻教程