mybatis面試題 二

2021-08-27 11:50:58 字數 2783 閱讀 5520

不同的xml對映檔案,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。

有了namespace,自然id就可以重複,namespace不同,namespace+id自然也就不同。

為什麼說mybatis是半自動orm對映工具?它與全自動的區別在**?

hibernate屬於全自動orm對映工具,使用hibernate查詢關聯物件或者關聯集合物件時,可以根據物件關係模型直接獲取,所以它是全自動的。而mybatis在查詢關聯物件或關聯集合物件時,需要手動編寫sql來完成,所以,稱之為半自動orm對映工具。

select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#  

select * from class c,teacher t,student s where c.teacher_id=t.t_id and c.c_id=s.class_id and c.c_id=#  

注:這道題是京東面試題。

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

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

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

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

mybatis僅可以編寫針對parameterhandler、resultsethandler、statementhandler、executor這4種介面的外掛程式,mybatis使用jdk的動態**,為需要攔截的介面生成**物件以實現介面方法攔截功能,每當執行這4種介面物件的方法時,就會進入攔截方法,具體就是invocationhandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。

實現mybatis的interceptor介面並複寫intercept()方法,然後在給外掛程式編寫註解,指定要攔截哪乙個介面的哪些方法即可,記住,別忘了在配置檔案中配置你編寫的外掛程式。

能,jdbc都能,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 |

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,支援延遲載入的原理都是一樣的。

不同的xml對映檔案,如果配置了namespace,那麼id可以重複;如果沒有配置namespace,那麼id不能重複;畢竟namespace不是必須的,只是最佳實踐而已。

Java面試題分享 Mybatis

問 在mybatis中,有兩種佔位符,區別是什麼 答 解析傳遞進來的引數資料,katex parse error expected eof got at position 21 進來的引數原樣拼接在sql中,是預編譯處理,是字串替換,使用 可以有效的防止sql注入,提高系統安全性。問 當實體類中的屬...

MyBatis高頻面試題總結

什麼是sql注入?sql注入 sqli 是一種注入攻擊,可以執行惡意sql語句。它通過將任意sql 插入資料庫查詢,使攻擊者能夠完全控制web應用程式後面的資料庫伺服器。攻擊者可以使用sql注入漏洞繞過應用程式安全措施 可以繞過網頁或web應用程式的身份驗證和授權,並檢索整個sql資料庫的內容 還可...

mybatis面試題 記錄

1 mybatis對jdbc做了哪些封裝?對jdbc運算元據庫的過程進行了封裝,使開發人員只需關注sql本身,而無需去花費精力去處理註冊驅動 建立connection 建立statement 手動設定引數 結果集檢索等jdbc複雜的過程 2 mybatis如何對映?通過namespace來關聯介面,...