Mybatis常見面試題總結


1、什么是Mybatis?
MyBatis 是一款優秀的持久層框架
MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集的過程
MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 實體類 【Plain Old Java Objects,普通的 Java對象】映射成數據庫中的記錄。

2、Mybaits的優點:
簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件就可以了,易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。sql寫在xml里,便於統一管理和優化。通過sql語句可以滿足操作數據庫的所有需求。
解除sql與程序代碼的耦合:通過提供DAO層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
提供xml標簽,支持編寫動態sql。

3、#{}和${}的區別是什么?
:#{}是預處理(可以有效的防止SQL注入),${}是字符串替換

4、通常一個mapper.xml文件,都會對應一個Dao接口,這個Dao接口的工作原理是什么?Dao接口里的方法,參數不同時,方法能重載嗎?
Mapper 接口的工作原理是JDK動態代理,Mybatis運行時會使用JDK動態代理為Mapper接口生成代理對象proxy,代理對象會攔截接口方法,根據類的全限定名+方法名,唯一定位到一個MapperStatement並調用執行器執行所代表的sql,然后將sql執行結果返回。
Mapper接口里的方法,是不能重載的,因為是使用 全限名+方法名 的保存和尋找策略。

5、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復?
不同的Xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;

原因就是namespace+id是作為Map<String, MapperStatement>的key使用的,如果沒有namespace,就剩下id,那么,id重復會導致數據互相覆蓋。有了namespace,自然id就可以重復,namespace不同,namespace+id自然也就不同。

6、Mybatis是如何進行分頁的?
在學習mybatis等持久層框架的時候,會經常對數據進行增刪改查操作,使用最多的是對數據庫進行查詢操作,如果查詢大量數據的時候,我們往往使用分頁進行查詢,
也就是每次處理小部分數據,這樣對數據庫壓力就在可控范圍內。
limit實現分頁(sql)
RowBounds分頁(java代碼上)

7、Mybatis的一級、二級緩存:
一級緩存也叫本地緩存:與數據庫同一次會話期間查詢到的數據會放在本地緩存中。以后如果需要獲取相同的數據,直接從緩存中拿,沒必須再去查詢數據庫;
二級緩存也叫全局緩存,基於namespace級別的緩存,一個名稱空間,對應一個二級緩存;
只要開啟了二級緩存,我們在同一個Mapper中的查詢,可以在二級緩存中拿到數據,查出的數據都會被默認先放在一級緩存中,只有會話提交或者關閉以后,一級緩存中的數據才會轉到二級緩存中.

8、Mybatis是如何將sql執行結果封裝為目標對象並返回的?都有哪些映射形式?
第一種是使用resultMap標簽,逐一定義數據庫列名和對象屬性名之間的映射關系。
第二種是使用sql列的別名功能,將列的別名書寫為對象屬性名。( 別名和java實體類的屬性名一致 .)
有了列名與屬性名的映射關系后,Mybatis通過反射創建對象,同時使用反射給對象的屬性逐一賦值並返回,那些找不到映射關系的屬性,是無法完成賦值的。

9、Mybatis動態sql有什么用?執行原理?有哪些動態sql?
Mybatis動態sql可以在xml映射文件內,以標簽的形式編寫動態sql,執行原理是根據表達式的值 完成邏輯判斷 並動態拼接sql的功能。
if, choose, when, otherwise, trim, where, set, foreach

10、Xml映射文件中,除了常見的select|insert|updae|delete標簽之外,還有哪些標簽?
resultMap、parameterMap、sql、include、selectKey,加上動態sql的9個標簽,其中 為sql片段標簽,通過 標簽引入sql片段, 為不支持自增的主鍵生成策略標簽。

11、使用MyBatis的mapper接口調用時有哪些要求?
Mapper.xml文件中的namespace即是mapper接口的類路徑。
Mapper接口方法名和mapper.xml中定義的每個sql的id相同;
Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同;
Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同;

12、 模糊查詢like語句該怎么寫?
第1種:在Java代碼中添加sql通配符。
第2種:在sql語句中拼接通配符,會引起sql注入

13、當實體類中的屬性名和表中的字段名不一樣 ,怎么辦 ?
第1種: 通過在查詢的sql語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致。
第2種: 通過resultMap來映射字段名和實體類屬性名的一一對應的關系。

14、如何獲取自動生成的(主)鍵值?
在mybatis的配置文件中,有個叫keyProperty和useGeneratedKeys的屬性。useGeneratedKeys 參數只針對 insert 語句生效,默認為 false。當設置為 true 時,表示如果插入的表以自增列為主鍵,則允許 JDBC 支持自動生成主鍵,並可將自動生成的主鍵返回。
useGeneratedKeys=”true” keyProperty=”對應的主鍵的對象”。

15、在mapper中如何傳遞多個參數?
`(1)第一種:DAO層的函數

(2)第二種: 使用 @param 注解:

(3)第三種:多個參數封裝成map

16.多對一和一對多處理
關聯-association 集合-collection
association是用於一對一和多對一,而collection是用於一對多的關系
按查詢嵌套處理(就像SQL中的子查詢)
按結果嵌套處理(就像SQL中的聯表查詢)

17、Mapper編寫有哪幾種方式?

18、什么是MyBatis的接口綁定?有哪些實現方式?
接口綁定,就是在MyBatis中任意定義接口,然后把接口里面的方法和SQL語句綁定, 我們直接調用接口方法就可以
接口綁定有兩種實現方式,一種是通過注解綁定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql語句來綁定;另外一種就是通過xml里面寫SQL來綁定, 在這種情況下,
要指定xml映射文件里面的namespace必須為接口的全路徑名。當Sql語句比較簡單時候,用注解綁定, 當SQL語句比較復雜時候,用xml綁定,一般用xml綁定的比較多。

Mybatis常見面試題總結:https://blog.csdn.net/a745233700/article/details/80977133


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM