MyBatis 之 十道常見的面試題

2021-08-20 17:35:48 字數 2425 閱讀 9958

1. #{}和${}的區別是什麼?

#{}是預編譯處理,${}是字串替換。

mybatis在處理#{}時,會將sql中的#{}替換為?號,呼叫preparedstatement的set方法來賦值;

mybatis在處理${}時,就是把${}替換成變數的值。

使用#{}可以有效的防止sql注入,提高系統安全性。

2. 通常乙個xml對映檔案,都會寫乙個dao介面與之對應,請問,這個dao介面的工作原理是什麼?dao介面裡的方法,引數不同時,方法能過載嗎?

dao介面裡的方法,是不能過載的,因為是全限名+方法名的儲存和尋找策略。

3. mybatis是如何進行分頁的?分頁外掛程式的原理是什麼?

mybatis使用rowbounds物件進行分頁,它是針對resultset結果集執行的記憶體分頁,而非物理分頁,可以在sql內直接書寫帶有物理分頁的引數來完成物理分頁功能,也可以使用分頁外掛程式來完成物理分頁。

分頁外掛程式的基本原理是使用mybatis提供的外掛程式介面,實現自定義外掛程式,在外掛程式的攔截方法內攔截待執行的sql,然後重寫sql,根據dialect方言,新增對應的物理分頁語句和物理分頁引數。

4. mybatis是如何將sql執行結果封裝為目標物件並返回的?都有哪些對映形式?

第一種是使用標籤,逐一定義列名和物件屬性名之間的對映關係。第二種是使用sql列的別名功能,將列別名書寫為物件屬性名,比如t_name as name,物件屬性名一般是name,小寫,但是列名不區分大小寫,mybatis會忽略列名大小寫,智慧型找到與之對應物件屬性名,你甚至可以寫成t_name as name,mybatis一樣可以正常工作。

有了列名與屬性名的對映關係後,mybatis通過反射建立物件,同時使用反射給物件的屬性逐一賦值並返回,那些找不到對映關係的屬性,是無法完成賦值的。

5. xml對映檔案中,除了常見的select|insert|update|delete標籤之外,還有哪些標籤?

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

還有很多其他的標籤,加上動態sql的9個標籤,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中為sql片段標籤,通過標籤引入sql片段,為不支援自增的主鍵生成策略標籤。

6. 簡述mybatis的外掛程式執行原理,以及如何編寫乙個外掛程式

mybatis僅可以編寫針對parameterhandler、resultsethandler、statementhandler、executor這4種介面的外掛程式,mybatis使用jdk的動態**,為需要攔截的介面生成**物件以實現介面方法攔截功能,每當執行這4種介面物件的方法時,就會進入攔截方法,具體就是invocationhandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。實現mybatis的interceptor介面並複寫intercept()方法,然後在給外掛程式編寫註解,指定要攔截哪乙個介面的哪些方法即可,記住,還需要在配置檔案中配置你編寫的外掛程式。

7. 一級、二級快取

1)一級快取: 基於 perpetualcache 的 hashmap 本地快取,其儲存作用域為 session,當 session flush 或 close 之後,該 session 中的所有 cache 就將清空。

3)對於快取資料更新機制,當某乙個作用域(一級快取 session/二級快取namespaces)的進行了c/u/d 操作後,預設該作用域下所有 select 中的快取將被 clear。

8. 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()方法的呼叫。這就是延遲載入的基本原理。

9. mybatis對映檔案中,如果a標籤通過include引用了b標籤的內容,請問,b標籤能否定義在a標籤的後面,還是說必須定義在a標籤的前面?

雖然mybatis解析xml對映檔案是按照順序解析的,但是,被引用的b標籤依然可以定義在任何地方,mybatis都可以正確識別。

原理是,mybatis解析a標籤,發現a標籤引用了b標籤,但是b標籤尚未解析到,尚不存在,此時,mybatis會將a標籤標記為未解析狀態,然後繼續解析餘下的標籤,包含b標籤,待所有標籤解析完畢,mybatis會重新解析那些被標記為未解析的標籤,此時再解析a標籤時,b標籤已經存在,a標籤也就可以正常解析完成了。

10. 簡述mybatis的xml對映檔案和mybatis內部資料結構之間的對映關係?

十道常見的MyBatis 面試題

目錄 1.和 的區別是什麼?2.通常乙個xml對映檔案,都會寫乙個dao介面與之對應,請問,這個dao介面的工作原理是什麼?dao介面裡的方法,引數不同時,方法能過載嗎?3.mybatis是如何進行分頁的?分頁外掛程式的原理是什麼?4.mybatis是如何將sql執行結果封裝為目標物件並返回的?都有...

面試前十道

1.前端頁面有哪三層構成,分別是什麼?作用是什麼?結構層 由 html 或 xhtml 之類的標記語言負責建立,僅負責語義的表達。解決了頁面 內容是什麼 的問題。表示層 由css負責建立,解決了頁面 如何顯示內容 的問題。行為層 由指令碼負責。解決了頁面上 內容應該如何對事件作出反應 的問題。2.請...

十道前端面試題(1)

陣列去重 http狀態碼 css彈性布局 position屬性有哪些值,分別有什麼含義 const和let的區別,可以改變const定義物件某個屬性嗎 this的理解,如何改變this的指向 let和var的區別,let的產生背景 var的變數提公升底層原理是什麼 箭頭函式,箭頭函式的特點 相同點 ...