前言
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。
小編分享的這份Java后端開發面試總結包含了JavaOOP、Java集合容器、Java異常、並發編程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL數據庫、消息中間件MQ、Dubbo、Linux、ZooKeeper、 分布式&數據結構與算法等26個專題技術點,都是小編在各個大廠總結出來的面試真題,已經有很多粉絲靠這份PDF拿下眾多大廠的offer,今天在這里總結分享給到大家!【已完結】
完整版Java面試題地址:2021最新面試題合集集錦。
1、模糊查詢like語句該怎么寫
2、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復?
- 不同的Xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;畢竟namespace不是必須的,只是最佳實踐而已。
- 原因就是namespace+id是作為Map<String, MappedStatement>的key使用的,如果沒有namespace,就剩下id,那么,id重復會導致數據互相覆蓋。有了namespace,自然id就可以重復,namespace不同,namespace+id自然也就不同。
3、Mybatis優缺點
優點
- 與傳統的數據庫訪問技術相比,ORM有以下優點:
- 基於SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便於統一管理;提供XML標簽,支持編寫動態SQL語句,並可重用
- 與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動開關連接很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)
- 提供映射標簽,支持對象與數據庫的ORM字段關系映射;提供對象關系映射標簽,支持對象關系組件維護
- 能夠與Spring很好的集成
缺點
- SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求
- SQL語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫
4、Mybatis是如何進行分頁的?分頁插件的原理是什么?
- Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。
- 分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。
- 舉例:select * from student,攔截sql后重寫為:select t.* from (select * from student) t limit 0, 10
5、請說說MyBatis的工作原理
在學習 MyBatis 程序之前,需要了解一下 MyBatis 工作原理,以便於理解程序。MyBatis 的工作原理如下圖:
6、Mybatis是否支持延遲加載?如果支持,它的實現原理是什么?
- Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。
- 它的原理是,使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法,比如調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那么就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,然后調用a.setB(b),於是a的對象b屬性就有值了,接着完成a.getB().getName()方法的調用。這就是延遲加載的基本原理。
- 當然了,不光是Mybatis,幾乎所有的包括Hibernate,支持延遲加載的原理都是一樣的。
7、Mybatis是如何將sql執行結果封裝為目標對象並返回的?都有哪些映射形式?
- 第一種是使用
標簽,逐一定義列名和對象屬性名之間的映射關系。 - 第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAME AS NAME,對象屬性名一般是name,小寫,但是列名不區分大小寫,Mybatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。
8、{}和${}的區別
- {}是占位符,預編譯處理;${}是拼接符,字符串替換,沒有預編譯處理。Mybatis在處理#{}時,#{}傳入參數是以字符串傳入,會將SQL中的#{}替換為?號,調用
- PreparedStatement的set方法來賦值。
- {} 可以有效的防止SQL注入,提高系統安全性;${} 不能防止SQL 注入
- {} 的變量替換是在DBMS 中;${} 的變量替換是在 DBMS 外
9、在mapper中如何傳遞多個參數
方法3:Map傳參法
10、簡述Mybatis的Xml映射文件和Mybatis內部數據結構之間的映射關系?
答:Mybatis將所有Xml配置信息都封裝到All-In-One重量級對象Confifiguration內部。在Xml映射文件中,