您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關MyBatis常見面試題和答案的內容。小編覺得挺實用的,因此分享給大家學習。如下資料是MyBatis的十道面試題和答案。
1、MyBatis是如何進行分頁的?分頁插件的原理是什么?
答案:MyBatis使用RowBounds對象進行分頁,它是針對ResultSet結果集執行的內存分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的參數來完成物理分頁功能,也可以使用分頁插件來完成物理分頁。分頁插件的基本原理是使用MyBatis提供的插件接口,實現自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql,根據dialect方言,添加對應的物理分頁語句和物理分頁參數。舉例:select * from student,攔截sql后重寫為:select t.* from (select * from student)t limit 0,10
2、簡述Mybatis的Xml映射文件和Mybatis內部數據結構之間的映射關系?
答案:Mybatis將所有Xml配置信息都封裝到All-In-One重量級對象Configuration內部。在Xml映射文件中,<parameterMap>標簽會被解析為ParameterMap對象,其每個子元素會被解析為ParameterMapping對象。
<resultMap>標簽會被解析為ResultMap對象,其每個子元素會被解析為ResultMapping對象。每一個<select>、<insert>、<update>、<delete>標簽均會被解析為MappedStatement對象,標簽內的sql會被解析為BoundSql對象。
3、MyBatis動態sql是做什么的?都有哪些動態sql?能簡述一下動態sql的執行原理不?
答案:MyBatis動態sql可以讓我們在Xml映射文件內,以標簽的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能,MyBatis提供了9種動態sql標簽trim|where|set|foreach|if|choose|when|otherwise|bind。其執行原理為,使用OGNL從sql參數對象中計算表達式的值,根據表達式的值動態拼接sql,以此來完成動態sql的功能。
4、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()方法的調用。這就是延遲加載的基本原理。
5、簡述MyBatis的插件運行原理,以及如何編寫一個插件。
答案:MyBatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,MyBatis使用JDK的動態代理,為需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。實現MyBatis的Interceptor接口并復寫intercept()方法,然后在給插件編寫注解,指定要攔截哪一個接口的哪些方法即可,記住,別忘了在配置文件中配置你編寫的插件。
6、Mybatis中如何指定使用哪一種Executor執行器?
答案:在Mybatis配置文件中,可以指定默認的ExecutorType執行器類型,也可以手動給DefaultSqlSessionFactory的創建SqlSession的方法傳遞ExecutorType類型參數。
7、Mybatis是否可以映射Enum枚舉類?
答案:Mybatis可以映射枚舉類,不單可以映射枚舉類,Mybatis可以映射任何對象到表的一列上。映射方式為自定義一個TypeHandler,實現TypeHandler的setParameter()和getResult()接口方法。TypeHandler有兩個作用,一是完成從javaType至jdbcType的轉換,二是完成jdbcType至javaType的轉換,體現為setParameter()和getResult()兩個方法,分別代表設置sql問號占位符參數和獲取列查詢結果。
8、Mybatis映射文件中,如果A標簽通過include引用了B標簽的內容,請問,B標簽能否定義在A標簽的后面,還是說必須定義在A標簽的前面?
答案:雖然Mybatis解析Xml映射文件是按照順序解析的,但是,被引用的B標簽依然可以定義在任何地方,Mybatis都可以正確識別。原理是,Mybatis解析A標簽,發現A標簽引用了B標簽,但是B標簽尚未解析到,尚不存在,此時,Mybatis會將A標簽標記為未解析狀態,然后繼續解析余下的標簽,包含B標簽,待所有標簽解析完畢,Mybatis會重新解析那些被標記為未解析的標簽,此時再解析A標簽時,B標簽已經存在,A標簽也就可以正常解析完成了。
9、為什么說Mybatis是半自動ORM映射工具?它與全自動的區別在哪里?
答案:Hibernate屬于全自動ORM映射工具,使用Hibernate查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。而Mybatis在查詢關聯對象或關聯集合對象時,需要手動編寫sql來完成,所以,稱之為半自動ORM映射工具。
10、MyBatis是如何將sql執行結果封裝為目標對象并返回的?都有哪些映射形式?
答:第一種是使用<resultMap>標簽,逐一定義列名和對象屬性名之間的映射關系。第二種是使用sql列的別名功能,將列別名書寫為對象屬性名,比如T_NAME AS NAME,對象屬性名一般是name,小寫,但是列名不區分大小寫,MyBatis會忽略列名大小寫,智能找到與之對應對象屬性名,你甚至可以寫成T_NAME AS NaMe,MyBatis一樣可以正常工作。有了列名與屬性名的映射關系后,MyBatis通過反射創建對象,同時使用反射給對象的屬性逐一賦值并返回,那些找不到映射關系的屬性,是無法完成賦值的。
關于MyBatis常見面試題和答案就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。