十道常見的MyBatis 面試題

2021-10-02 10:08:34 字數 2452 閱讀 8740

目錄

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

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

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

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

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

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

7. 一級、二級快取

8. mybatis是否支援延遲載入?如果支援,它的實現原理是什麼?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

MyBatis 之 十道常見的面試題

1.和 的區別是什麼?是預編譯處理,是字串替換。mybatis在處理 時,會將sql中的 替換為?號,呼叫preparedstatement的set方法來賦值 mybatis在處理 時,就是把 替換成變數的值。使用 可以有效的防止sql注入,提高系統安全性。2.通常乙個xml對映檔案,都會寫乙個da...

十道前端面試題(1)

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

十道前端面試題(2)

為什麼css樣式初始化,目的是為了什麼 js繼承 常見布局的方法 rem,px,em的區別 typeof去判斷資料型別返回值有哪些 快排和冒泡的原理 清除浮動的方法 定時器settimeout的執行機制 get和post的請求區別 浮動元素有什麼特性 之所以要進行css樣式初始化是因為不同瀏覽器對標...