1. 程式人生 > 其它 >Mybatis面試題小結

Mybatis面試題小結

MyBatis與Hibernate有哪些不同?

  Mybatis是半自動ORM框架,sql需要自己寫在xml裡面,靈活性高。Hibernate是全自動ORM框架,不需要自己寫sql語句,程式碼簡便,資料庫可移植性高(換資料庫影響小)。

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

  #{}通過PreparedStatement預處理,sql語法結構已經編譯好,#{}內的內容再替換不會發生sql注入。

  ${}是字串直接替換,有sql注入的問題。

當實體類中的屬性名和表中的欄位名不一樣 ,怎麼辦 ?

  1)別名 select xxx as xxx from ……

  2)resultMap把物件屬性名和資料庫欄位名一一對應

Mybatis動態標籤?

  if、choose、otherwise、when、where、set、foreach、trim、bind

  具體參考:https://blog.csdn.net/qq_39623058/article/details/88779242

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

  Dao層或者Mapper介面,每個方法都有一個MapperStatement與之一一對應,這個方法由XML中的namespace+id(介面的全限定名+方法名)確定。無關引數列表,因此也不能過載。

Mybatis是如何進行分頁的?分頁外掛的原理是什麼?

  RowBounds,是基於ResultSet的結果的記憶體分頁。也可以自己通過sql寫物理分頁。

  外掛是實現了MyBatis的分頁介面,在外掛的攔截器內進行SQL分頁語句和分頁引數的拼接,實現物理分頁。

簡述Mybatis的外掛執行原理,以及如何編寫一個外掛

  Mybatis提供四個外掛介面,ParameterHandler、ResultSetHandler、StatementHandler、Executor。原理是JDK的動態代理,攔截方法進行增強。

  編寫:在配置檔案中配置好自定義的外掛,自定義實現上面四個介面之一後,註解標明要攔截的方法。

如何執行批量插入?·

  1)MyBatis的動態標籤,Collection和item進行sql拼接。

  2)把sqlSession的ExecutorType設定為batch,在Mapper的Java程式碼中實現批量插入。

  Mybatis推薦的官方例項為第二種。

巢狀查詢和巢狀結果?

  巢狀查詢需要查詢資料庫N+1次,而巢狀結果只執行一條sql;巢狀查詢是先通過一條sql返回多條結果集,再通過每條結果集進行關聯查詢,多表查詢優先使用巢狀結果。

MyBatis實現一對一和一對多有幾種方式?具體怎麼操作的?

  MyBatis一對一和一對多,都可以通過巢狀查詢和巢狀結果實現。一對一的巢狀查詢用到Association動態標籤,一對多是Collection;巢狀結果是通過sql的多表關聯查詢。

Mybatis的一級、二級快取?

  Mybatis預設開啟一級快取,基於perpetualCache的HashMap儲存,作用域為Session。要開啟二級快取,entity實體類序實現序列化介面,快取機制和一級快取相同,作用域為Mapper(namespace)。

  具體可以參考文章:https://i.cnblogs.com/posts?cateId=2111477&page=1https://blog.csdn.net/weixin_37139197/article/details/82908377

Mybatis都有哪些Executor執行器?它們之間的區別是什麼?

  SimpleExecutor預設執行器,每次執行前開啟statement,執行後關閉。

  ReuseExecutor,每次執行前查詢statement,如果存在則複用,不存在則建立,執行後不關閉物件。

  BatchExecutor,把update(JDBC不支援Select)的statement依次addBatch,然後統一執行。