mybatis常見面試 筆試題

2021-08-03 23:03:38 字數 3973 閱讀 9589

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

${}是properties檔案中的變數佔位符;它可以用於標籤屬性值和sql內部,屬於靜態文字替換; 

比如$會被靜態替換為com.mysql.jdbc.driver。 

#{}是sql的引數佔位符; mybatis會將sql中的#{}替換為?號;在sql執行前會使用preparedstatement的引數設定方法,按序給sql的?號佔位符設定引數值。 

比如ps.setint(0, parametervalue);#的取值方式為使用反射從引數物件中獲取item物件的name屬性值,相當於param.getitem().getname()。

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

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

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

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

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

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

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

舉例:select * from student,攔截sql後重寫為:select t.* from (select * from student)t limit 0,10。

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

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

6、mybatis執行批量插入,能返回資料庫主鍵列表嗎?

答:能,jdbc都能,mybatis當然也能。 

7、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的功能。

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

第一種是使用標籤,逐一定義列名和物件屬性名之間的對映關係。 第二種是使用sql列的別名功能,將列別名書寫為物件屬性名。 

比如:t_name as name,物件屬性名一般是name,小寫,但是列名不區分大小寫,mybatis會忽略列名大小寫,智慧型找到與之對應物件屬性名,你甚至可以寫成t_name as name,mybatis一樣可以正常工作。 

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

9、mybatis能執行一對

一、一對多的級聯查詢嗎?都有哪些實現方式,以及它們之間的區別。

能,mybatis不僅可以執行一對

一、一對多的級聯查詢,還可以執行多對一,多對多的級聯查詢。 

多對一查詢,其實就是一對一查詢,只需要把selectone()修改為selectlist()即可; 

多對多查詢,其實就是一對多查詢,只需要把selectone()修改為selectlist()即可。 

級聯物件查詢,有兩種實現方式:

一種是單獨傳送乙個sql去查詢級聯物件,賦給主物件,然後返回主物件。 

另一種是使用巢狀查詢,巢狀查詢的含義為使用join查詢,一部分列是a物件的屬性值,另外一部分列是關聯物件b的屬性值,好處是只發乙個sql查詢,就可以把主物件及其關聯物件查出來。 

> 那麼問題來了,join查詢出來100條記錄,如何確定主物件是5個,而不是100個?其去重複的原理

是標籤內的子標籤,指定了唯一確定一條記錄的id列,mybatis根據列值來完成100條記錄的去重複功能,可以有多個,代表了聯合主鍵的語意。 

同樣主物件的關聯物件,也是根據這個原理去重複的,儘管一般情況下,只有主物件會有重覆記錄,關聯物件一般不會重複。 

舉例:下面join查詢出來6條記錄,一、二列是teacher物件列,第三列為student物件列,mybatis去重複處理後,結果為1個老師6個學生,而不是6個老師6個學生。

t_id    t_name           s_id

| 1

| teacher |

38 |

| 1

| teacher |

39 |

| 1

| teacher |

40 |

| 1

| teacher |

41 |

| 1

| teacher |

42 |

| 1

| teacher |

43 |

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

當然了,不光是mybatis,幾乎所有的包括hibernate,支援延遲載入的原理都是一樣的。

11、mybatis的xml對映檔案中,不同的xml對映檔案,id是否可以重複?

不同的xml對映檔案,如果配置了namespace,那麼id可以重複; 

如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。 

原因就是namespace+id是作為map

mybatis常見面試題

1.mybatis動態sql是做什麼的?都有哪些動態sql,簡單描述一下動態sql的執行原理?mybatis動態sql是 指在對映檔案xml中可以通過標籤的形式編寫動態sql,完成邏輯判斷和動態拼接sql的功能。有9種動態sql標籤 trim where set foeach if choose w...

MyBatis常見面試題

1.和 的區別。是預編譯處理,是字串替換。mybatis在處理 時,會將sql中的 替換為?號,呼叫preparedstatement的set方法來賦值。mybatis在處理 時,就是把 替換成變數的值。使用 可以有效的防止sql注入,提高系統安全性。可以使用 時盡量使用 2.mybatis與hib...

Mybatis 的常見面試題

背景 好久沒用mybatis了,有些面試題還是要好好準備的。問題集mybatis 的常見面試題 mybatis常見面試題總結 ps 總結的還是很全面的 mybatis常見面試題1 精講 和 的區別是什麼?使用 可以有效的防止sql注入,提高系統安全性。原因在於 預編譯機制。預編譯完成之後,sql的結...