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)。
Mybatis都有哪些Executor執行器?它們之間的區別是什麼?
SimpleExecutor預設執行器,每次執行前開啟statement,執行後關閉。
ReuseExecutor,每次執行前查詢statement,如果存在則複用,不存在則建立,執行後不關閉物件。
BatchExecutor,把update(JDBC不支援Select)的statement依次addBatch,然後統一執行。