這篇文章給大家分享的是有關(guān)MyBatis常見面試題和答案的內(nèi)容。小編覺得挺實用的,因此分享給大家學(xué)習(xí)。如下資料是MyBatis的十道面試題和答案?!?/p>
在崇州等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,營銷型網(wǎng)站,成都外貿(mào)網(wǎng)站建設(shè),崇州網(wǎng)站建設(shè)費用合理。
1、MyBatis是如何進(jìn)行分頁的?分頁插件的原理是什么?
答案:MyBatis使用RowBounds對象進(jìn)行分頁,它是針對ResultSet結(jié)果集執(zhí)行的內(nèi)存分頁,而非物理分頁,可以在sql內(nèi)直接書寫帶有物理分頁的參數(shù)來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。分頁插件的基本原理是使用MyBatis提供的插件接口,實現(xiàn)自定義插件,在插件的攔截方法內(nèi)攔截待執(zhí)行的sql,然后重寫sql,根據(jù)dialect方言,添加對應(yīng)的物理分頁語句和物理分頁參數(shù)。舉例:select * from student,攔截sql后重寫為:select t.* from (select * from student)t limit 0,10
2、簡述Mybatis的Xml映射文件和Mybatis內(nèi)部數(shù)據(jù)結(jié)構(gòu)之間的映射關(guān)系?
答案:Mybatis將所有Xml配置信息都封裝到All-In-One重量級對象Configuration內(nèi)部。在Xml映射文件中,
3、MyBatis動態(tài)sql是做什么的?都有哪些動態(tài)sql?能簡述一下動態(tài)sql的執(zhí)行原理不?
答案:MyBatis動態(tài)sql可以讓我們在Xml映射文件內(nèi),以標(biāo)簽的形式編寫動態(tài)sql,完成邏輯判斷和動態(tài)拼接sql的功能,MyBatis提供了9種動態(tài)sql標(biāo)簽trim|where|set|foreach|if|choose|when|otherwise|bind。其執(zhí)行原理為,使用OGNL從sql參數(shù)對象中計算表達(dá)式的值,根據(jù)表達(dá)式的值動態(tài)拼接sql,以此來完成動態(tài)sql的功能。
4、MyBatis是否支持延遲加載?如果支持,它的實現(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)方法時,進(jìn)入攔截器方法,比如調(diào)用a.getB().getName(),攔截器invoke()方法發(fā)現(xiàn)a.getB()是null值,那么就會單獨發(fā)送事先保存好的查詢關(guān)聯(lián)B對象的sql,把B查詢上來,然后調(diào)用a.setB(b),于是a的對象b屬性就有值了,接著完成a.getB().getName()方法的調(diào)用。這就是延遲加載的基本原理。
5、簡述MyBatis的插件運(yùn)行原理,以及如何編寫一個插件。
答案:MyBatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,MyBatis使用JDK的動態(tài)代理,為需要攔截的接口生成代理對象以實現(xiàn)接口方法攔截功能,每當(dāng)執(zhí)行這4種接口對象的方法時,就會進(jìn)入攔截方法,具體就是InvocationHandler的invoke()方法,當(dāng)然,只會攔截那些你指定需要攔截的方法。實現(xiàn)MyBatis的Interceptor接口并復(fù)寫intercept()方法,然后在給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,記住,別忘了在配置文件中配置你編寫的插件。
6、Mybatis中如何指定使用哪一種Executor執(zhí)行器?
答案:在Mybatis配置文件中,可以指定默認(rèn)的ExecutorType執(zhí)行器類型,也可以手動給DefaultSqlSessionFactory的創(chuàng)建SqlSession的方法傳遞ExecutorType類型參數(shù)。
7、Mybatis是否可以映射Enum枚舉類?
答案:Mybatis可以映射枚舉類,不單可以映射枚舉類,Mybatis可以映射任何對象到表的一列上。映射方式為自定義一個TypeHandler,實現(xiàn)TypeHandler的setParameter()和getResult()接口方法。TypeHandler有兩個作用,一是完成從javaType至jdbcType的轉(zhuǎn)換,二是完成jdbcType至javaType的轉(zhuǎn)換,體現(xiàn)為setParameter()和getResult()兩個方法,分別代表設(shè)置sql問號占位符參數(shù)和獲取列查詢結(jié)果。
8、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)簽尚未解析到,尚不存在,此時,Mybatis會將A標(biāo)簽標(biāo)記為未解析狀態(tài),然后繼續(xù)解析余下的標(biāo)簽,包含B標(biāo)簽,待所有標(biāo)簽解析完畢,Mybatis會重新解析那些被標(biāo)記為未解析的標(biāo)簽,此時再解析A標(biāo)簽時,B標(biāo)簽已經(jīng)存在,A標(biāo)簽也就可以正常解析完成了。
9、為什么說Mybatis是半自動ORM映射工具?它與全自動的區(qū)別在哪里?
答案:Hibernate屬于全自動ORM映射工具,使用Hibernate查詢關(guān)聯(lián)對象或者關(guān)聯(lián)集合對象時,可以根據(jù)對象關(guān)系模型直接獲取,所以它是全自動的。而Mybatis在查詢關(guān)聯(lián)對象或關(guān)聯(lián)集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具。
10、MyBatis是如何將sql執(zhí)行結(jié)果封裝為目標(biāo)對象并返回的?都有哪些映射形式?
答:第一種是使用
關(guān)于MyBatis常見面試題和答案就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。