25道經典mybatis面試題,不容錯過


1.JDBC有幾個步驟?
JDBC大致可以分為六個步驟:

加載驅動程序
獲得數據庫連接
創建一個Statement對象
操作數據庫,實現增刪改查
獲取結果集
關閉資源
2.什么是Mybatis?
如果在面試的時候被問到,只要你說出下面三種即可:


MyBatis 是一款優秀的持久層框架,它支持自定義 SQL、存儲過程以及高級映射。

MyBatis 免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。

MyBatis 可以通過簡單的 XML 或注解來配置和映射原始類型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。


——來自官網。推薦大家按照官方的來回答。

3.什么是ORM?
全稱為Object Relational Mapping。對象-映射-關系型數據庫。對象關系映射(簡稱ORM,或O/RM,或O/R mapping),用於實現面向對象編程語言里不同類型系統的數據之間的轉換。簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象與關系數據庫相互映射。

ORM提供了實現持久化層的另一種模式,它采用映射元數據來描述對象關系的映射,使得ORM中間件能在任何一個應用的業務邏輯層和數據庫層之間充當橋梁。

4.說說ORM的優缺點
「優點」1.提高了開發效率。由於ORM可以自動對Entity對象與數據庫中的Table進行字段與屬性的映射,所以我們實際可能已經不需要一個專用的、龐大的數據訪問層。2.ORM提供了對數據庫的映射,不用sql直接編碼,能夠像操作對象一樣從數據庫獲取數據。

「缺點」犧牲程序的執行效率和會固定思維模式,降低了開發的靈活性。

從系統結構上來看,采用ORM的系統一般都是多層系統,系統的層次多了,效率就會降低。ORM是一種完全的面向對象的做法,而面向對象的做法也會對性能產生一定的影響。

在我們開發系統時,一般都有性能問題。性能問題主要產生在算法不正確和與數據庫不正確的使用上。

ORM所生成的代碼一般不太可能寫出很高效的算法,在數據庫應用上更有可能會被誤用,主要體現在對持久對象的提取和和數據的加工處理上,如果用上了ORM,程序員很有可能將全部的數據提取到內存對象中,然后再進行過濾和加工處理,這樣就容易產生性能問題。

在對對象做持久化時,ORM一般會持久化所有的屬性,有時,這是不希望的。但ORM是一種工具,工具確實能解決一些重復,簡單的勞動。這是不可否認的。但我們不能指望工具能一勞永逸的解決所有問題,有些問題還是需要特殊處理的,但需要特殊處理的部分對絕大多數的系統,應該是很少的。

5.說說Mybaits的優缺點
優點
① 基於SQL語句編程,相當靈活,不會對應用程序或者數據庫的現有設計造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便於統一管理;提供XML標簽,支持編寫動態SQL語句,並可重用。

② 與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動開關連接;

③ 很好的與各種數據庫兼容(因為MyBatis使用JDBC來連接數據庫,所以只要JDBC支持的數據庫MyBatis都支持)。

④ 能夠與Spring很好的集成;

⑤ 提供映射標簽,支持對象與數據庫的ORM字段關系映射;提供對象關系映射標簽,支持對象關系組件維護。

缺點
① SQL語句的編寫工作量較大,尤其當字段多、關聯表多時,對開發人員編寫SQL語句的功底有一定要求。

② SQL語句依賴於數據庫,導致數據庫移植性差,不能隨意更換數據庫。

MyBatis框架適用場合:

(1)MyBatis專注於SQL本身,是一個足夠靈活的DAO層解決方案。

(2)對性能的要求很高,或者需求變化較多的項目,如互聯網項目,MyBatis將是不錯的選擇。

6.Mybatis是如何進行分頁的?
Mybatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,先把數據都查出來,然后再做分頁。

可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。

7.分頁插件的基本原理是什么?
分頁插件的基本原理是使用Mybatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql(SQL拼接limit),根據dialect方言,添加對應的物理分頁語句和物理分頁參數,用到了技術JDK動態代理,用到了責任鏈設計模式。

8.簡述Mybatis的插件運行原理?
Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis使用JDK的動態代理,為需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。

9.如何編寫一個插件?
編寫插件:實現Mybatis的Interceptor接口並復寫intercept()方法,然后再給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,最后在配置文件中配置你編寫的插件。推薦:建議收藏,mybatis插件原理詳解

10.Mybatis動態sql有什么用?
Mybatis動態sql可以在Xml映射文件內,以標簽的形式編寫動態sql,執行原理是根據表達式的值完成邏輯判斷 並動態調整sql的功能。

Mybatis提供了9種動態sql標簽:trim | where | set | foreach | if | choose | when | otherwise | bind。

11.Xml映射文件中有哪些標簽?
除了常見的select|insert|updae|delete標簽之外,還有:

,加上動態sql的9個標簽,其中 為sql片段標簽,通過 標簽引入sql片段, 為不支持自增的主鍵生成策略標簽。

12.Mybatis是否支持延遲加載?
Mybatis僅支持association關聯對象和collection關聯集合對象的延遲加載,association指的就是一對一,collection指的就是一對多查詢。在Mybatis配置文件中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false。

13.延遲加載的基本原理是什么?
延遲加載的基本原理是,使用CGLIB創建目標對象的代理對象,當調用目標方法時,進入攔截器方法。

比如調用a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那么就會單獨發送事先保存好的查詢關聯B對象的sql,把B查詢上來,然后調用a.setB(b),於是a的對象b屬性就有值了,接着完成a.getB().getName()方法的調用。

當然了,不光是Mybatis,幾乎所有的包括Hibernate,支持延遲加載的原理都是一樣的。

14.mapper.xml文件對應的Dao接口原理是?
簡單說:使用了JDK動態代理和反射,把接口和xml綁定在一起而搞定的。

15.Dao接口里的方法,參數不同時能重載嗎?
不能重載。

16.#{}和${}的區別是什么?
${}是字符串替換,#{}是預處理;

Mybatis在處理時,就是把{}直接替換成變量的值。而Mybatis在處理#{}時,會對sql語句進行預處理,將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;

使用#{}可以有效的防止SQL注入,提高系統安全性。

17.Mybatis執行批量插入,能返回數據庫主鍵列表嗎?
1、對於支持生成自增主鍵的數據庫:增加 useGenerateKeys和keyProperty , 標簽屬性。

2、不支持生成自增主鍵的數據庫:使用

方式:


insert into Author (username, password, email, bio) values

(#{item.username}, #{item.password}, #{item.email}, #{item.bio})


注意Mybatis的版本,官方在這個3.3.1版本中加入了批量新增返回主鍵id的功能 。

18.不同的Xml映射文件,id是否可以重復?
不同的Xml映射文件,如果配置了namespace,那么id可以重復;如果沒有配置namespace,那么id不能重復;畢竟namespace不是必須的,只是最佳實踐而已。

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

19.Mybatis中Executor執行器的區別是?
Mybatis有三種基本的Executor執行器,「SimpleExecutor、ReuseExecutor、BatchExecutor。」

SimpleExecutor:每執行一次update或select,就開啟一個Statement對象,用完立刻關閉Statement對象。

ReuseExecutor:執行update或select,以sql作為key查找Statement對象,存在就使用,不存在就創建,用完后,不關閉Statement對象,而是放置於Map<String, Statement>內,供下一次使用。簡言之,就是重復使用Statement對象。

BatchExecutor:執行update(沒有select,JDBC批處理不支持select),將所有sql都添加到批處理中(addBatch()),等待統一執行(executeBatch()),它緩存了多個Statement對象,每個Statement對象都是addBatch()完畢后,等待逐一執行executeBatch()批處理。與JDBC批處理相同。

作用范圍:Executor的這些特點,都嚴格限制在SqlSession生命周期范圍內。

20.為什么說Mybatis是半自動ORM映射工具?
Hibernate屬於全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。

而Mybatis在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具。

(2)Mybatis直接編寫原生態sql,可以嚴格控制sql執行性能,靈活度高,非常適合對關系數據模型要求不高的軟件開發,因為這類軟件需求變化頻繁,一但需求變化要求迅速輸出成果。但是靈活的前提是mybatis無法做到數據庫無關性,如果需要實現支持多種數據庫的軟件,則需要自定義多套sql映射文件,工作量大。

(3)Hibernate對象/關系映射能力強,數據庫無關性好,對於關系模型要求高的軟件,如果用hibernate開發可以節省很多代碼,提高效率。

其實關於常見ORM框架還設有Spring的JPA,后期的面試可能會更傾向於問JPA和Mybatis的區別了。希望大家留意點。

21.Mybatis全局配置文件中有哪些標簽?

configuration 配置

properties 屬性:可以加載

properties配置文件的信息

settings 設置:可以設置mybatis的全局屬性

typeAliases 類型命名

typeHandlers 類型處理器

objectFactory 對象工廠

plugins 插件

environments 環境

environment 環境變量

transactionManager 事務管理器

dataSource 數據源

mappers 映射器


22.當實體類中的屬性名和表中的字段名不一樣時怎么辦 ?
第 1 種:通過在查詢的 sql 語句中定義字段名的別名,讓字段名的別名和實體類的屬性名一致。

第 2 種:通過 來映射字段名和實體類屬性名的一一對應的關系。

第 3 種:使用注解時候,使用Result,和第二種類似。

23.模糊查詢 like 語句該怎么寫?
第 1 種:在 Java 代碼中添加 sql 通配符。

String wildcardname = “%smi%”;
list names = mapper.selectlike(wildcardname);

第 2 種:在 sql 語句中拼接通配符,會引起 sql 注入

String wildcardname = “smi”;
list names = mapper.selectlike(wildcardname);

24.Mybatis構建步驟?
整體步驟:

25.簡述一下Mybatis 的手動編程步驟?
創建 SqlSessionFactory

通過 SqlSessionFactory 創建 SqlSession

通過 sqlsession 執行數據庫操作

調用 session.commit()提交事務

調用 session.close()關閉會話

25.Mybatis工作的流程是?
Mybatis工作流程可以大致分為四個步驟:


免責聲明!

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



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