1. 程式人生 > 其它 >MyBatis核心面試題

MyBatis核心面試題

MyBatis優點(為什麼用MyBatis 不用jpa)

MyBatis提供了連線池(避免了開啟連線池 關閉連線池帶來的程式碼的冗餘) 提供了快取的功能,自動結果的封裝

提供了動態SQL語句能力,將SQL語句和java程式碼分離 提供了高階對映規則

MyBatis執行的流程/原理: mybatis提供的兩個配置檔案config主配置檔案和mapper配置檔案,通過配置檔案可以得到SqlSessionFactory 工廠物件 通過SqlSessionFactory工廠物件可以得到sqlSession 得到session後可以執行SQL。

SqlSession通過底層提供的Exexutor執行器執行SQL語句,mybatis 將mapper.xml中的sqlStatement 解析為MappedStatement物件 通過引數輸入 引數型別有三種 HashMap 簡單型別 pojo

在資料庫中執行SQL語句 輸出得到結果 輸出型別有三種 HashMap,簡單型別 pojo

mybatis的輸入引數型別: 簡單型別 pojo hashmap

mybatis任何解決實體類的屬性和資料庫列名不一致的情況: 在查詢SQL語句的時候給列名起個別名 手動對映resultmap 將結果封裝成hashmap 駝峰命名規則

mybatis 進行取值的時候 可以使用$ 和# 二者的區別是什麼?

#取值的時候是對SQL語句進行一個預編譯 用佔位符?來代替 用於引數傳遞 $ 是對SQL語句的and拼接

#{}:預編譯佔位符 SQL語句用?號代替

#{}:獲取引數時和引數名無關

#{}:可以防止SQL注入${} 不能防止SQL注入

${}SQL語句的拼接 需要判斷引數的型別 做具體的處理

${} 獲取引數通過${value} 如果指定引數名需要通過@param("xxx") 在介面的方法宣告中指定。

mybatis基於介面方式對資料庫進行操作的時候 需要遵循哪些規則:

1) Mapper 的namespace必須和mapper介面的全路徑一致

2) Mapper介面的方法名必須和SQL定義的id一致

3) Mapper介面中方法的輸入引數型別必須和SQL定義的parameterType 一致

4) Mapper介面中方法是輸出引數型別必須和SQL定義的resultType 一致

mybatis是任何支援多環境配置的? 在config配置檔案裡面 標籤<environments> 有兩個屬性 default 屬性用來選擇某一個環境是生效的 id屬性是用來指定現在用的是哪一個環境 一個<environments> 標籤是一個配置環境。

當介面中的引數有多個時 你是如何取值的? 將這些引數封裝成物件 或者封裝成hashmap 可以使用#{0} #{1}.... 或者#{param1} #{param2} 或者在方法的引數前面加註解 @param

mybatis 常用的動態SQL語句的標籤有哪些? if choose-when-otherwise foreach(批量刪除) set(可以有選擇性的修改) where(模糊查詢) trim

if choose-when-otherwise 的區別: if 是做條件的一個and拼接 可能有條件 可以沒有條件 可能有多個條件 choose-when-otherwise 最多最少都會只執行一個條件 哪個在前面並且滿足條件就先執行它

mybatis的查詢策略(mybatis是怎麼做查詢的?)mybatis在做查詢的時候 不是直接去資料庫查詢的 而是先去快取中命中(查詢) 如果命中成功則直接將結果返回 沒有命中 此時會先去資料庫中查詢 將查詢到的結果儲存一份到快取中 然後再將結果返回 當下一次做相同查詢的時候 就可以直接從快取中命中 當做增刪改的時候 會刷出快取。

mybatis對快取的支援: 提供了一級快取和二級快取 一級快取的作用域是session預設是開啟的 當openSession() 後 如果執行相同的SQL(相同語句和引數) 不執行SQL語句 而是從快取中命中返回 所以手動關閉。二級快取的作用域是一個mapper的namespace 同一個namespace中查詢SQL語句可以從快取中命中 二級快取是可以跨session的 也是自動開啟的 但是我們還是要手動開啟 雖然它預設是開啟的 但是要指明二級快取的開關 但是如果我們不手動開啟的話 是沒有效果的。此外還需要在核心配置檔案的setting中配置cacheEnabled 同時pojo物件必須是可序列化的 既要求實現序列化介面。

如何開啟快取: 開啟二級快取 在mapper.xml 檔案中加入<cache/>

使用時注意事項: 必須要讓你的實體類實現序列化介面 所以二級快取 它的本質是實現序列化的過程,二級快取不需要我們手動關閉。

當返回的結果中包含了另外一個物件的引用時 需要我們手動對映 通過association 高階對映 把你的結果對映到結果集裡面

當返回的結果包含了一個集合的引用時, 通過collection高階對映 來把你的結果對映到集合裡面。

連線池原理: 沒有緩衝區的話 每次的訪問都要去訪問資料庫 每次的訪問都會造成資料庫的壓力 所以我們要建立一個緩衝區 每次查詢的時候就到緩衝區中獲取連線 當查詢完畢之後 再把連線歸還到緩衝區中

常見的快取淘汰機制有哪些? 快取滿了如何去清理: 一共就兩種 1: 先進先出 按照時間去排序 最先到緩衝區的會最先出去 它可以保證快取裡面的都是最新的熱點。2: 最小活躍度

介面中的方法是不能過載(同類同名不同參)的 因為mapper.xml 裡面的SQL語句的id是唯一的

ORM:物件關係對映