主頁 >  其他 > 2019年mybatils面試高頻題(java)

2019年mybatils面試高頻題(java)

2020-09-11 01:22:46 其他

前前言

2019即將過去,伴隨我們即將迎來的又是新的一年,過完春節,馬上又要迎來新的金三銀四面試季, 那么,作為程式猿的你,是否真的有所準備的呢,亦或是安于本職作業,繼續做好手頭上的事情,

當然,不論選擇如何,假如你真的準備在之后的金三銀四跳槽的話,那么作為一個Java工程師,就不可不看了, 如何在幾個月的時間里,快速的為即將到來的面試進行充分的準備呢?

一、什么是MyBatis?

答:MyBatis是一個可以自定義SQL、存盤程序和高級映射的持久層框架,

二、講下MyBatis的快取

答:MyBatis的快取分為一級快取和二級快取,一級快取放在session里面,默認就有二級快取放在它的命名空間里,默認是不打開的,使用二級快取屬性類需要實作Serializable序列化介面(可用來保存物件的狀態),可在它的映射檔案中配置

三、Mybatis是如何進行分頁的?分頁插件的原理是什么?

答:
1、Mybatis使用RowBounds物件進行分頁,也可以直接撰寫sql實作分頁,也可以使用Mybatis的分頁插件,
2、分頁插件的原理:實作Mybatis提供的介面,實作自定義插件,在插件的攔截方法內攔截待執行的sql,然后重寫sql,
舉例:select * from student,攔截sql后重寫為:select t.* from (select * from student)t limit 0,10

四、簡述Mybatis的插件運行原理,以及如何撰寫一個插件?

答:
1、Mybatis僅可以撰寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種介面的插件,Mybatis通過動態代理,為需要攔截的介面生成代理物件以實作介面方法攔截功能,每當執行這4種介面物件的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法,
2、實作Mybatis的Interceptor介面并復寫intercept()方法,然后在給插件撰寫注解,指定要攔截哪一個介面的哪些方法即可,記住,別忘了在組態檔中配置你撰寫的插件,

五、Mybatis動態sql是做什么的?都有哪些動態sql?能簡述一下動態sql的執行原理不?

答:
1、Mybatis動態sql可以讓我們在Xml映射檔案內,以標簽的形式撰寫動態sql,完成邏輯判斷和動態拼接sql的功能,
2、Mybatis提供了9種動態sql標簽:trim|where|set|foreach|if|choose|when|otherwise|bind,
3、其執行原理為,使用OGNL從sql引數物件中計算運算式的值,根據運算式的值動態拼接sql,以此來完成動態sql的功能,

六、#{}和${}的區別是什么?

答:
1、#{}是預編譯處理,

不能識別此Latex公式:{}是字串替換,2、Mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫PreparedStatement的set方法來賦值;3、Mybatis在處理
{}時,就是把${}替換成變數的值,
4、使用#{}可以有效的防止SQL注入,提高系統安全性,

 

七、為什么說Mybatis是半自動ORM映射工具?它與全自動的區別在哪里?

答:Hibernate屬于全自動ORM映射工具,使用Hibernate查詢關聯物件或者關聯集合物件時,可以根據物件關系模型直接獲取,所以它是全自動的,而Mybatis在查詢關聯物件或關聯集合物件時,需要手動撰寫sql來完成,所以,稱之為半自動ORM映射工具,

八、Mybatis是否支持延遲加載?如果支持,它的實作原理是什么?

答:
1、Mybatis僅支持association關聯物件和collection關聯集合物件的延遲加載,association指的就是一對一,collection指的就是一對多查詢,在Mybatis組態檔中,可以配置是否啟用延遲加載lazyLoadingEnabled=true|false,
2、它的原理是,使用CGLIB創建目標物件的代理物件,當呼叫目標方法時,進入攔截器方法,比如呼叫a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那么就會單獨發送事先保存好的查詢關聯B物件的sql,把B查詢上來,然后呼叫a.setB(b),于是a的物件b屬性就有值了,接著完成a.getB().getName()方法的呼叫,這就是延遲加載的基本原理,

九、MyBatis與Hibernate有哪些不同?

答:
1、Mybatis和hibernate不同,它不完全是一個ORM框架,因為MyBatis需要程式員自己撰寫Sql陳述句,不過mybatis可以通過XML或注解方式靈活配置要運行的sql陳述句,并將java物件和sql陳述句映射生成最終執行的sql,最后將sql執行的結果再映射生成java物件,
2、Mybatis學習門檻低,簡單易學,程式員直接撰寫原生態sql,可嚴格控制sql執行性能,靈活度高,非常適合對關系資料模型要求不高的軟體開發,例如互聯網軟體、企業運營類軟體等,因為這類軟體需求變化頻繁,一但需求變化要求成果輸出迅速,但是靈活的前提是mybatis無法做到資料庫無關性,如果需要實作支持多種資料庫的軟體則需要自定義多套sql映射檔案,作業量大,
3、Hibernate物件/關系映射能力強,資料庫無關性好,對于關系模型要求高的軟體(例如需求固定的定制化軟體)如果用hibernate開發可以節省很多代碼,提高效率,但是Hibernate的缺點是學習門檻高,要精通門檻更高,而且怎么設計O/R映射,在性能和物件模型之間如何權衡,以及怎樣用好Hibernate需要具有很強的經驗和能力才行,
總之,按照用戶的需求在有限的資源環境下只要能做出維護性、擴展性良好的軟體架構都是好架構,所以框架只有適合才是最好,

十、MyBatis的好處是什么?

答:
1、MyBatis把sql陳述句從Java源程式中獨立出來,放在單獨的XML檔案中撰寫,給程式的維護帶來了很大便利,
2、MyBatis封裝了底層JDBC API的呼叫細節,并能自動將結果集轉換成Java Bean物件,大大簡化了Java資料庫編程的重復作業,
3、因為MyBatis需要程式員自己去撰寫sql陳述句,程式員可以結合資料庫自身的特點靈活控制sql陳述句,因此能夠實作比Hibernate等全自動orm框架更高的查詢效率,能夠完成復雜查詢,

十一、簡述Mybatis的Xml映射檔案和Mybatis內部資料結構之間的映射關系?

標簽會被決議為ParameterMap物件,其每個子元素會被決議為ParameterMapping物件,標簽會被決議為ResultMap物件,其每個子元素會被決議為ResultMapping物件,每一個