溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MyBatis常見面試題有哪些

發(fā)布時(shí)間:2021-12-30 09:54:45 來源:億速云 閱讀:167 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)MyBatis常見面試題有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

  1、什么是Mybatis?

  Mybatis是一個(gè)半ORM(對象關(guān)系映射)框架,它內(nèi)部封裝了JDBC,開發(fā)時(shí)只需要關(guān)注SQL語句本身,不需要花費(fèi)精力去處理加載驅(qū)動(dòng)、創(chuàng)建連接、創(chuàng)建statement等繁雜的過程。程序員直接編寫原生態(tài)sql,可以嚴(yán)格控制sql執(zhí)行性能,靈活度高。

  MyBatis 可以使用 XML 或注解來配置和映射原生信息,將 POJO映射成數(shù)據(jù)庫中的記錄,避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。

  通過xml 文件或注解的方式將要執(zhí)行的各種 statement 配置起來,并通過java對象和 statement中sql的動(dòng)態(tài)參數(shù)進(jìn)行映射生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結(jié)果映射為java對象并返回。(從執(zhí)行sql到返回result的過程)。

  2、#{}和${}的區(qū)別是什么?

  正確的答案是:#{}是預(yù)編譯處理,${}是字符串替換。

  (1)mybatis在處理#{}時(shí),會(huì)將sql中的#{}替換為?號,調(diào)用PreparedStatement的set方法來賦值。

  (2)mybatis在處理${}時(shí),就是把${}替換成變量的值。

  (3)使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性。原因在于:預(yù)編譯機(jī)制。預(yù)編譯完成之后,SQL的結(jié)構(gòu)已經(jīng)固定,即便用戶輸入非法參數(shù),也不會(huì)對SQL的結(jié)構(gòu)產(chǎn)生影響,從而避免了潛在的安全風(fēng)險(xiǎn)。

  (4)預(yù)編譯是提前對SQL語句進(jìn)行預(yù)編譯,而其后注入的參數(shù)將不會(huì)再進(jìn)行SQL編譯。我們知道,SQL注入是發(fā)生在編譯的過程中,因?yàn)閻阂庾⑷肓四承┨厥庾址?,最后被編譯成了惡意的執(zhí)行操作。而預(yù)編譯機(jī)制則可以很好的防止SQL注入。

  最后,補(bǔ)充一點(diǎn):

  $符號一般用來當(dāng)作占位符,常使用Linux腳本的人應(yīng)該對此有更深的體會(huì)吧。例如:$1,$2等等表示輸入?yún)?shù)的占位符。知道了這點(diǎn)就能很容易區(qū)分$和#,從而不容易記錯(cuò)了。

  3、Mybatis是如何進(jìn)行分頁的?分頁插件的原理是什么?

  Mybatis使用RowBounds對象進(jìn)行分頁,它是針對ResultSet結(jié)果集執(zhí)行的內(nèi)存分頁,而非物理分頁,可以在sql內(nèi)直接書寫帶有物理分頁的參數(shù)來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。

  分頁插件的基本原理是使用Mybatis提供的插件接口,實(shí)現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的sql,然后重寫sql,根據(jù)dialect方言,添加對應(yīng)的物理分頁語句和物理分頁參數(shù)。

  4、MyBatis與Hibernate有哪些不同?

  Mybatis和hibernate不同,它不完全是一個(gè)ORM框架,因?yàn)镸yBatis需要程序員自己編寫Sql語句。

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

  Hibernate對象/關(guān)系映射能力強(qiáng),數(shù)據(jù)庫無關(guān)性好,對于關(guān)系模型要求高的軟件,如果用hibernate開發(fā)可以節(jié)省很多代碼,提高效率。

  5、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重復(fù)?

  不同的Xml映射文件,如果配置了namespace,那么id可以重復(fù);如果沒有配置namespace,那么id不能重復(fù);

  原因就是namespace+id是作為Map的key使用的,如果沒有namespace,就剩下id,那么,id重復(fù)會(huì)導(dǎo)致數(shù)據(jù)互相覆蓋。有了namespace,自然id就可以重復(fù),namespace不同,namespace+id自然也就不同。

  6、Mybatis是如何將sql執(zhí)行結(jié)果封裝為目標(biāo)對象并返回的?都有哪些映射形式?

  第一種是使用標(biāo)簽,逐一定義列名和對象屬性名之間的映射關(guān)系。第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAME AS NAME,對象屬性名一般是name,小寫,但是列名不區(qū)分大小寫,Mybatis會(huì)忽略列名大小寫,智能找到與之對應(yīng)對象屬性名,你甚至可以寫成T_NAME AS NaMe,Mybatis一樣可以正常工作。

  有了列名與屬性名的映射關(guān)系后,Mybatis通過反射創(chuàng)建對象,同時(shí)使用反射給對象的屬性逐一賦值并返回,那些找不到映射關(guān)系的屬性,是無法完成賦值的。

  7、Xml映射文件中,除了常見的|||標(biāo)簽之外,還有哪些標(biāo)簽?

  注:這道題出自京東面試官。

  還有很多其他的標(biāo)簽,加上動(dòng)態(tài)sql的9個(gè)標(biāo)簽,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中為sql片段標(biāo)簽,通過標(biāo)簽引入sql片段,為不支持自增的主鍵生成策略標(biāo)簽。

  8、簡述Mybatis的插件運(yùn)行原理,以及如何編寫一個(gè)插件

  Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis使用JDK的動(dòng)態(tài)代理,為需要攔截的接口生成代理對象以實(shí)現(xiàn)接口方法攔截功能,每當(dāng)執(zhí)行這4種接口對象的方法時(shí),就會(huì)進(jìn)入攔截方法,具體就是InvocationHandler的invoke()方法,當(dāng)然,只會(huì)攔截那些你指定需要攔截的方法。

  實(shí)現(xiàn)Mybatis的Interceptor接口并復(fù)寫intercept()方法,然后在給插件編寫注解,指定要攔截哪一個(gè)接口的哪些方法即可,記住,還需要在配置文件中配置你編寫的插件。

  9、一級、二級緩存

  1)一級緩存: 基于 PerpetualCache 的 HashMap 本地緩存,其存儲作用域?yàn)?Session,當(dāng) Session flush 或 close 之后,該 Session 中的所有 Cache 就將清空。

  2)二級緩存與一級緩存其機(jī)制相同,默認(rèn)也是采用 PerpetualCache,HashMap 存儲,不同在于其存儲作用域?yàn)? Mapper(Namespace),并且可自定義存儲源,如 Ehcache。要開啟二級緩存,你需要在你的 SQL 映射文件中添加一行:

  3)對于緩存數(shù)據(jù)更新機(jī)制,當(dāng)某一個(gè)作用域(一級緩存 Session/二級緩存Namespaces)的進(jìn)行了C/U/D 操作后,默認(rèn)該作用域下所有 中的緩存將被 clear。

  10、為什么說Mybatis是半自動(dòng)ORM映射工具?它與全自動(dòng)的區(qū)別在哪里?

  Hibernate屬于全自動(dòng)ORM映射工具,使用Hibernate查詢關(guān)聯(lián)對象或者關(guān)聯(lián)集合對象時(shí),可以根據(jù)對象關(guān)系模型直接獲取,所以它是全自動(dòng)的。而Mybatis在查詢關(guān)聯(lián)對象或關(guān)聯(lián)集合對象時(shí),需要手動(dòng)編寫sql來完成,所以,稱之為半自動(dòng)ORM映射工具。

  11、Mybatis是否支持延遲加載?如果支持,它的實(shí)現(xiàn)原理是什么?

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

  它的原理是,使用CGLIB創(chuàng)建目標(biāo)對象的代理對象,當(dāng)調(diào)用目標(biāo)方法時(shí),進(jìn)入攔截器方法,比如調(diào)用a.getB().getName(),攔截器invoke()方法發(fā)現(xiàn)a.getB()是null值,那么就會(huì)單獨(dú)發(fā)送事先保存好的查詢關(guān)聯(lián)B對象的sql,把B查詢上來,然后調(diào)用a.setB(b),于是a的對象b屬性就有值了,接著完成a.getB().getName()方法的調(diào)用。這就是延遲加載的基本原理。

  12、Mybatis映射文件中,如果A標(biāo)簽通過include引用了B標(biāo)簽的內(nèi)容,請問,B標(biāo)簽?zāi)芊穸x在A標(biāo)簽的后面,還是說必須定義在A標(biāo)簽的前面?

  雖然Mybatis解析Xml映射文件是按照順序解析的,但是,被引用的B標(biāo)簽依然可以定義在任何地方,Mybatis都可以正確識別。

  原理是,Mybatis解析A標(biāo)簽,發(fā)現(xiàn)A標(biāo)簽引用了B標(biāo)簽,但是B標(biāo)簽尚未解析到,尚不存在,此時(shí),Mybatis會(huì)將A標(biāo)簽標(biāo)記為未解析狀態(tài),然后繼續(xù)解析余下的標(biāo)簽,包含B標(biāo)簽,待所有標(biāo)簽解析完畢,Mybatis會(huì)重新解析那些被標(biāo)記為未解析的標(biāo)簽,此時(shí)再解析A標(biāo)簽時(shí),B標(biāo)簽已經(jīng)存在,A標(biāo)簽也就可以正常解析完成了。

  13、簡述Mybatis的Xml映射文件和Mybatis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之間的映射關(guān)系?

  Mybatis將所有Xml配置信息都封裝到All-In-One重量級對象Configuration內(nèi)部。在Xml映射文件中,標(biāo)簽會(huì)被解析為ParameterMap對象,其每個(gè)子元素會(huì)被解析為ParameterMapping對象。標(biāo)簽會(huì)被解析為ResultMap對象,其每個(gè)子元素會(huì)被解析為ResultMapping對象。

  每一個(gè)<>、<>、<>、<>標(biāo)簽均會(huì)被解析為MappedStatement對象,標(biāo)簽內(nèi)的sql會(huì)被解析為BoundSql對象。

  14、Xml映射文件中,除了常見的||updae|標(biāo)簽之外,還有哪些標(biāo)簽?

  答:、、、、,加上動(dòng)態(tài)sql的9個(gè)標(biāo)簽,其中為sql片段標(biāo)簽,通過標(biāo)簽引入sql片段,為不支持自增的主鍵生成策略標(biāo)簽。

  15、Mybaits有哪些優(yōu)點(diǎn)?

  (1)基于SQL語句編程,相當(dāng)靈活,不會(huì)對應(yīng)用程序或者數(shù)據(jù)庫的現(xiàn)有設(shè)計(jì)造成任何影響,SQL寫在XML里,解除sql與程序代碼的耦合,便于統(tǒng)一管理;提供XML標(biāo)簽,支持編寫動(dòng)態(tài)SQL語句,并可重用。

  (2)與JDBC相比,減少了50%以上的代碼量,消除了JDBC大量冗余的代碼,不需要手動(dòng)開關(guān)連接;

  (3)很好的與各種數(shù)據(jù)庫兼容(因?yàn)镸yBatis使用JDBC來連接數(shù)據(jù)庫,所以只要JDBC支持的數(shù)據(jù)庫MyBatis都支持)。

  (4)能夠與Spring很好的集成;

  (5)提供映射標(biāo)簽,支持對象與數(shù)據(jù)庫的ORM字段關(guān)系映射;提供對象關(guān)系映射標(biāo)簽,支持對象關(guān)系組件維護(hù)。

感謝各位的閱讀!關(guān)于“MyBatis常見面試題有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI