java面試-mybatis篇

WXY_WXY發表於2024-05-05

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

  #{}是預編譯處理,在mybatis處理#{}時,會將其轉換為?,這種方式可以有效避免sql注入。

  ${}是字串替換,在mybatis處理${}時,會將其替換成變數的值。

2.通常一個xml對映檔案,都會有一個對應的dao介面。請問這個dao介面原理是什麼,dao介面的方法引數不同時,支援過載嗎?

  Dao介面就是mapper介面。介面的全限名就是對映檔案的namespace的值。介面的方法名就是對映檔案的id值,介面方法內的引數就是傳遞給sql的引數。

  mapper介面是透過“全限名+方法名”作為key進行儲存的,唯一對應一個mapperStatement物件。

  mapper介面的工作原理是透過jdk動態代理,為mapper生成代理物件proxy,然後執行對應的mapperStatement物件所代表的sql,然後將sql執行結果返回。

3.mybatis的三級快取

  一級快取預設是開啟的,作用域是SqlSession 級別的,所以命中率極低。相同SqlSession ,多次呼叫同一個Mapper和同一個方法的同一個引數,只會進行一次資料庫查詢,然後把資料快取到緩衝中,以後直接先從快取中取出資料,不會直接去查資料庫。

  二級快取是多個 SqlSession 共享的,其作用域是 mapper 的同一個 namespace,不同 的 sqlSession 兩次執行相同 namespace 下的 sql 語句且向 sql 中傳遞引數也相同即最終執行 相同的 sql 語句,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次會從 快取中獲取資料將不再從資料庫查詢,從而提高查詢效率。Mybatis 預設沒有開啟二級快取 需要在 setting 全域性引數中配置開啟二級快取。

  三級快取基於SessionFactory級別的快取,由於一級快取二級快取的命中率極低,都是在單個程序之類進行快取,多程序快取就不好使,mybatis預設提供了介面可以自定義快取。需要藉助redis。

相關文章