1、什么是 MyBatis?
答:MyBatis 是一個(gè)可以自定義 SQL、存儲(chǔ)過(guò)程和高級(jí)映射的持久層框架。
2、講下 MyBatis 的緩存
答:MyBatis 的緩存分為一級(jí)緩存和二級(jí)緩存,一級(jí)緩存放在 session 里面,默認(rèn)就有,二級(jí)緩
存放在它的命名空間里,默認(rèn)是不打開的,使用二級(jí)緩存屬性類需要實(shí)現(xiàn) Serializable 序列化
接口(可用來(lái)保存對(duì)象的狀態(tài)),可在它的映射文件中配置<cache/>
3、Mybatis 是如何進(jìn)行分頁(yè)的?分頁(yè)插件的原理是什么?
答:
1)Mybatis 使用 RowBounds 對(duì)象進(jìn)行分頁(yè),也可以直接編寫 sql 實(shí)現(xiàn)分頁(yè),也可以使用
Mybatis 的分頁(yè)插件。
2)分頁(yè)插件的原理:實(shí)現(xiàn) Mybatis 提供的接口,實(shí)現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔
截待執(zhí)行的 sql,然后重寫 sql。
舉例:select from student,攔截 sql 后重寫為:select t. from (select from student)t
limit 0,10
4、簡(jiǎn)述 Mybatis 的插件運(yùn)行原理,以及如何編寫一個(gè)插件?
答:
1)Mybatis 僅可以編寫針對(duì) ParameterHandler、ResultSetHandler、StatementHandler、
Executor 這 4 種接口的插件,Mybatis 通過(guò)動(dòng)態(tài)代理,為需要攔截的接口生成代理對(duì)象以實(shí)
現(xiàn)接口方法攔截功能,每當(dāng)執(zhí)行這 4 種接口對(duì)象的方法時(shí),就會(huì)進(jìn)入攔截方法,具體就是
InvocationHandler 的 invoke()方法,當(dāng)然,只會(huì)攔截那些你指定需要攔截的方法。
2)實(shí)現(xiàn) Mybatis 的 Interceptor 接口并復(fù)寫 intercept()方法,然后在給插件編寫注解,指定
要攔截哪一個(gè)接口的哪些方法即可,記住,別忘了在配置文件中配置你編寫的插件。
5、Mybatis 動(dòng)態(tài) sql 是做什么的?都有哪些動(dòng)態(tài) sql?能簡(jiǎn)述一下動(dòng)態(tài) sql 的執(zhí)行原理不?
答:
1)Mybatis 動(dòng)態(tài) sql 可以讓我們?cè)?Xml 映射文件內(nèi),以標(biāo)簽的形式編寫動(dòng)態(tài) sql,完成邏輯
判斷和動(dòng)態(tài)拼接 sql 的功能。
2)Mybatis 提供了 9 種動(dòng)態(tài) sql 標(biāo)簽:
trim|where|set|foreach|if|choose|when|otherwise|bind。
3)其執(zhí)行原理為,使用 OGNL 從 sql 參數(shù)對(duì)象中計(jì)算表達(dá)式的值,根據(jù)表達(dá)式的值動(dòng)態(tài)拼
接 sql,以此來(lái)完成動(dòng)態(tài) sql 的功能。
6、#{}和${}的區(qū)別是什么?
答:
1)#{}是預(yù)編譯處理,${}是字符串替換。
2)Mybatis 在處理#{}時(shí),會(huì)將 sql 中的#{}替換為?號(hào),調(diào)用 PreparedStatement 的 set 方法
來(lái)賦值;
3)Mybatis 在處理${}時(shí),就是把${}替換成變量的值。
4)使用#{}可以有效的防止 SQL 注入,提高系統(tǒng)安全性。
7、為什么說(shuō) Mybatis 是半自動(dòng) ORM 映射工具?它與全自動(dòng)的區(qū)別在哪里?
答:Hibernate 屬于全自動(dòng) ORM 映射工具,使用 Hibernate 查詢關(guān)聯(lián)對(duì)象或者關(guān)聯(lián)集合對(duì)象
時(shí),可以根據(jù)對(duì)象關(guān)系模型直接獲取,所以它是全自動(dòng)的。而 Mybatis 在查詢關(guān)聯(lián)對(duì)象或
關(guān)聯(lián)集合對(duì)象時(shí),需要手動(dòng)編寫 sql 來(lái)完成,所以,稱之為半自動(dòng) ORM 映射工具。
8、Mybatis 是否支持延遲加載?如果支持,它的實(shí)現(xiàn)原理是什么?
答:
1)Mybatis 僅支持 association 關(guān)聯(lián)對(duì)象和 collection 關(guān)聯(lián)集合對(duì)象的延遲加載,association
指的就是一對(duì)一,collection 指的就是一對(duì)多查詢。在 Mybatis 配置文件中,可以配置是否
啟用延遲加載 lazyLoadingEnabled=true|false。
2)它的原理是,使用 CGLIB 創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象,當(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 對(duì)象的 sql,把 B 查詢上來(lái),然后調(diào)用 a.setB(b),于是 a 的
對(duì)象 b 屬性就有值了,接著完成 a.getB().getName()方法的調(diào)用。這就是延遲加載的基本原
理。
9、MyBatis 與 Hibernate 有哪些不同?
答:
1)Mybatis 和 hibernate 不同,它不完全是一個(gè) ORM 框架,因?yàn)?MyBatis 需要程序員自己
編寫 Sql 語(yǔ)句,不過(guò) mybatis 可以通過(guò) XML 或注解方式靈活配置要運(yùn)行的 sql 語(yǔ)句,并將
java 對(duì)象和 sql 語(yǔ)句映射生成最終執(zhí)行的 sql,最后將 sql 執(zhí)行的結(jié)果再映射生成 java 對(duì)
象。
2)Mybatis 學(xué)習(xí)門檻低,簡(jiǎn)單易學(xué),程序員直接編寫原生態(tài) sql,可嚴(yán)格控制 sql 執(zhí)行性
能,靈活度高,非常適合對(duì)關(guān)系數(shù)據(jù)模型要求不高的軟件開發(fā),例如互聯(lián)網(wǎng)軟件、企業(yè)運(yùn)
營(yíng)類軟件等,因?yàn)檫@類軟件需求變化頻繁,一但需求變化要求成果輸出迅速。但是靈活的
前提是 mybatis 無(wú)法做到數(shù)據(jù)庫(kù)無(wú)關(guān)性,如果需要實(shí)現(xiàn)支持多種數(shù)據(jù)庫(kù)的軟件則需要自定
義多套 sql 映射文件,工作量大。
3)Hibernate 對(duì)象/關(guān)系映射能力強(qiáng),數(shù)據(jù)庫(kù)無(wú)關(guān)性好,對(duì)于關(guān)系模型要求高的軟件(例如
需求固定的定制化軟件)如果用 hibernate 開發(fā)可以節(jié)省很多代碼,提高效率。但是
Hibernate 的缺點(diǎn)是學(xué)習(xí)門檻高,要精通門檻更高,而且怎么設(shè)計(jì) O/R 映射,在性能和對(duì)象
模型之間如何權(quán)衡,以及怎樣用好 Hibernate 需要具有很強(qiáng)的經(jīng)驗(yàn)和能力才行。
總之,按照用戶的需求在有限的資源環(huán)境下只要能做出維護(hù)性、擴(kuò)展性良好的軟件架構(gòu)都
是好架構(gòu),所以框架只有適合才是最好。
10、MyBatis 的好處是什么?
答:
1)MyBatis 把 sql 語(yǔ)句從 Java 源程序中獨(dú)立出來(lái),放在單獨(dú)的 XML 文件中編寫,給程序的
維護(hù)帶來(lái)了很大便利。
2)MyBatis 封裝了底層 JDBC API 的調(diào)用細(xì)節(jié),并能自動(dòng)將結(jié)果集轉(zhuǎn)換成 Java Bean 對(duì)象,
大大簡(jiǎn)化了 Java 數(shù)據(jù)庫(kù)編程的重復(fù)工作。
3)因?yàn)?MyBatis 需要程序員自己去編寫 sql 語(yǔ)句,程序員可以結(jié)合數(shù)據(jù)庫(kù)自身的特點(diǎn)靈活
控制 sql 語(yǔ)句,因此能夠?qū)崿F(xiàn)比 Hibernate 等全自動(dòng) orm 框架更高的查詢效率,能夠完成復(fù)
雜查詢。
11、簡(jiǎn)述 Mybatis 的 Xml 映射文件和 Mybatis 內(nèi)部數(shù)據(jù)結(jié)構(gòu)之間的映射關(guān)系?
答:Mybatis 將所有 Xml 配置信息都封裝到 All-In-One 重量級(jí)對(duì)象 Configuration 內(nèi)部。在
Xml 映射文件中,<parameterMap>標(biāo)簽會(huì)被解析為 ParameterMap 對(duì)象,其每個(gè)子元素會(huì)
被解析為 ParameterMapping 對(duì)象。<resultMap>標(biāo)簽會(huì)被解析為 ResultMap 對(duì)象,其每個(gè)子
元素會(huì)被解析為 ResultMapping 對(duì)象。每一個(gè)<select>、<insert>、<update>、<delete>標(biāo)簽
均會(huì)被解析為 MappedStatement 對(duì)象,標(biāo)簽內(nèi)的 sql 會(huì)被解析為 BoundSql 對(duì)象。
12、什么是 MyBatis 的接口綁定,有什么好處?
答:接口映射就是在 MyBatis 中任意定義接口,然后把接口里面的方法和 SQL 語(yǔ)句綁定,我們
直接調(diào)用接口方法就可以,這樣比起原來(lái)了 SqlSession 提供的方法我們可以有更加靈活的選
擇和設(shè)置.
13、接口綁定有幾種實(shí)現(xiàn)方式,分別是怎么實(shí)現(xiàn)的?
答:接口綁定有兩種實(shí)現(xiàn)方式,一種是通過(guò)注解綁定,就是在接口的方法上面加上
@Select@Update 等注解里面包含 Sql 語(yǔ)句來(lái)綁定,另外一種就是通過(guò) xml 里面寫 SQL 來(lái)綁
定,在這種情況下,要指定 xml 映射文件里面的 namespace 必須為接口的全路徑名.
14、什么情況下用注解綁定,什么情況下用 xml 綁定?
答:當(dāng) Sql 語(yǔ)句比較簡(jiǎn)單時(shí)候,用注解綁定;當(dāng) SQL 語(yǔ)句比較復(fù)雜時(shí)候,用 xml 綁定,一般用
xml 綁定的比較多
15、MyBatis 實(shí)現(xiàn)一對(duì)一有幾種方式?具體怎么操作的?
答:有聯(lián)合查詢和嵌套查詢,聯(lián)合查詢是幾個(gè)表聯(lián)合查詢,只查詢一次,通過(guò)在 resultMap 里面
配置 association 節(jié)點(diǎn)配置一對(duì)一的類就可以完成;嵌套查詢是先查一個(gè)表,根據(jù)這個(gè)表里面
的結(jié)果的外鍵 id,去再另外一個(gè)表里面查詢數(shù)據(jù),也是通過(guò) association 配置,但另外一個(gè)表的
查詢通過(guò) select 屬性配置。*
創(chuàng)新互聯(lián)建站從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元烏什做網(wǎng)站,已為上家服務(wù),為烏什各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
喜歡文章記得點(diǎn)個(gè)贊,感謝支持!
分享題目:精心整理了15道面試官喜歡問(wèn)的MyBatis面試題
文章出自:http://sd-ha.com/article14/geggde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、手機(jī)網(wǎng)站建設(shè)、微信小程序、建站公司、微信公眾號(hào)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)