Mybatis執行流程、緩存原理及相關面試題匯總

一、Mybatis執行流程

具體分析Mybatis是如何操作數據庫的!

、

1、定義我們的核心配置文件的路徑,這個路徑是從target/classes下開始找的!

 String config = "mybatis-config.xml" ;

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WiYjb6lj-1642251251122)(Mybatis課堂筆記.assets/image-20220115155815228.png)]

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默認開啟的!

如下是對一級緩存進行測試:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cxzrwerK-1642251251124)(Mybatis課堂筆記.assets/image-20220115164223901.png)]

查看我們的測試結果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IBQtKdyL-1642251251125)(Mybatis課堂筆記.assets/image-20220115164344380.png)]

采用不同的SqlSession測試數據,進行如下修改!

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Vk9HjHYg-1642251251126)(Mybatis課堂筆記.assets/image-20220115164551824.png)]

我們再次查看測試結果

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-DpZ3eHA6-1642251251126)(Mybatis課堂筆記.assets/image-20220115164724002.png)]

得出結論我們的一級緩存隻是在同一個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!

推薦閱讀: