Mybatis執行流程、緩存原理及相關面試題匯總
一、Mybatis執行流程
具體分析Mybatis是如何操作數據庫的!
1、定義我們的核心配置文件的路徑,這個路徑是從target/classes下開始找的!
String config = "mybatis-config.xml" ;
2、讀取這個config表示的文件
InputStream inputStream= Resources.getResourceAsStream(config);
3、創建SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
4、創建SqlSessionFactory對象
SqlSessionFactory sessionFactory = builder.build(inputStream);
5、獲取SqlSession對象,從SqlSessionFactory中獲取
SqlSession sqlSession = sessionFactory.openSession();
6、【重點】執行我們的執行的的sql語句標識。sql文件中的namespace + sql標簽的Id值
String sqlId = "com.sqx.dao.UserMapper.getUserById";
7、執行sql語句,通過sqlId找到語句,並執行!
List<Object> objects = sqlSession.selectList(sqlId);
8、關閉SqlSession
sqlSession.close();
總結
Myabtis啟動的時候會加載mybatis-config.xml這個核心配置文件,得到要操作的數據庫以及我們Mapper文件的的信息,然後將其以數據流的形式保存起來傳給SqlSessionFactoryBuilder,創造出對應該數據庫的SqlSessionFactory工廠,工廠生產SqlSession,這個SqlSession中包含瞭對該庫的增刪改查方法,我們需要通過namespace + sqlId
來確定我們執行的是哪個sql,這一步操作可以通過SqlSeesion.getMapper()拿到接口,通過調用接口的方法(方法綁定瞭我們的sql,包含namespace + sqlId
),執行對應的SQL語句!
二、Mybatis緩存
Mybatis緩存無論是一級緩存還是二級緩存都是本地緩存,都會占用JVM的內存,一旦Java停止緩存失效!
1、一級緩存
概述
- 一級緩存保存在我們的SqlSession當中
- 隻要是同一個SqlSesisson(與數據庫建立的會話)就會使用同一個緩存
- 一級緩存是我們Mybatis默認開啟的!
如下是對一級緩存進行測試:
查看我們的測試結果
采用不同的SqlSession測試數據,進行如下修改!
我們再次查看測試結果
得出結論我們的一級緩存隻是在同一個SqlSession當中有效!
2、二級緩存
概述
二級緩存又稱"全局緩存",是基於namespace級別的緩存,一個namespace對應一個二級緩存!
工作機制:
- 一個會話查詢一條數據,這個數據會被放在一級緩存當中
- 當我們會話關閉的時候,會把這個數據從1級緩存遷入二級緩存當中,新的會話就可以在二級緩存當中找到這個數據!
- 不同的會話查詢不同的namespace的時候,會將不同namespace中的數據緩存到自己對應的緩存(map)中!
使用步驟 :
隻需在需要使用緩存的namespace 中加入< cache/>
即可
<!--在當前Mapper.xml中使用二級緩存,並配置相關參數--> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> eviction :緩存的回收策略 LRU(最長時間未使用)、LFU(訪問次數最少)、FIFO(默認)、SOFT(軟引用)、WEAK(弱引用) flushInterval : 緩存刷新間隔 緩存多久清空一次,默認是不會清空的,設置一個毫秒值 readOnly :是否隻讀 size :緩存存放多少元素
我們還可以通過配置實現自定義緩存
<!-- 開啟mybatis的二級緩存,其本質還是我們mybatis幫我們實現瞭自身提供的緩存接口Cache, 也就是cache標簽的type屬性默認指定瞭緩存策略 --> <cache type=""/> <!--本質上就是這種寫法,我們可通該修改type來選擇自定緩存策略--> <cache type="rg.apache.ibatis.cache.impl.PerpetualCache"/>
3、緩存原理
如圖所示
緩存執行流程
- 當我們的sql執行的時候,先去二級緩存namespace中查看是否存在緩存,
- 然後如果二級緩存不存在,查看當前sqlSession中一級緩存中是否存在,
- 最後一、二級緩存中都不存在的話那麼就去數據庫查詢,
- 接著會將查詢出來的結果保存在我們的一級緩存當中,
- 當前會話(SqlSession)結束,就會將一級緩存中的數據,同步到我們的二級緩存
三、相關面試題
1、為什麼說 Mybatis 是半自動ORM映射工具?它與全自動的區別在哪裡?
什麼是ORM
ORM(Object Relational Mapping),對象關系映射,是一種為瞭解決關系型數據庫數據與簡單 Java 對象(POJO)建裡映射關系的技術。
為什麼說 Mybatis 是半自動ORM映射工具?它與全自動的區別在哪裡?
- 首先,像 Hibernate、JPA 這種屬於全自動 ORM 映射工具,使用 Hibernate 查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。
- 而 Mybatis 在查詢關聯對象或關聯集合對象時,需要手動編寫 sql 來完成,所以,稱之為半自動 ORM 映射工具。
- 換句話來解釋就是說 MyBatis 是 半自動 ORM 最主要的一個原因是,它需要在 XML 或者註解裡通過手動或插件生成 SQL,才能完成 SQL 執行結果與對象映射綁定。
2、簡述一下Mybatis的執行流程吧 ?
- MyBatis 是以一個 SqlSessionFactory 實例為核心,SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。
- SqlSessionFactoryBuilder 可以從 XML 配置文件或一個預先配置的 Configuration 實例來構建出 SqlSessionFactory 實例。
- SqlSessionFactory 實例工廠可以生產 SqlSession ,它裡面提供瞭在數據庫執行 SQL 命令所需的所有方法。
3、說一下Mybatis的優缺點 ?
優點
- 基於SQL語句編寫、相當靈活,SQL寫在XML文件當中,解除瞭sql與程序代碼的耦合,便於統一管理
- 消除瞭JDBC的冗餘代碼、能夠與Spring很好的集成
缺點
- SQL語句的編寫工作量大,尤其是字段多,關聯表多的情況下,對開發人員的SQL語句功底有一定的要求
- SQL語句依賴數據庫,導致數據庫移植性差,不能隨意更換數據庫
4、#{} 和 ${} 的區別是什麼 ?
- #{} 是占位符,預編譯處理,${}是拼接符,字符串替換,沒有預編譯處理
- mybatis在處理#{}的時候,#{} 傳入的參數是字符串,會將SQL中的#{} 替換為?調用PreparedStatement的Set方法賦值
- myabtsi在處理的 時 候 , 就 是 原 值 傳 入 , 就 是 把 {}的時候,就是原值傳入,就是把的時候,就是原值傳入,就是把{}替換為傳來的值
- #{}通過編譯預處理可以有效地防止SQL註入問題,提高系統的安全性,${}則不能防止SQL註入
5、Mybatis的動態SQL有什麼作用?執行原理是什麼?有哪些常用標簽?
- mybatis動態sql可以在xml映射文件內,以標簽的形式編寫動態sql
- 執行原理:根據參數表達式的值完成邏輯判斷,並且動態拼接sql
- mybatis提供9種動態sql的標簽:trim、where、set、foreach、if、choose、when、otherwise、bind
總結
到此這篇關於Mybatis執行流程、緩存原理及相關面試題的文章就介紹到這瞭,更多相關Mybatis執行流程、緩存及面試題內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!