天天看點

mybatis面試題

#{} 是編譯預處理,${} 是字元串替換 mybatis在處理 #{} ,會将sql語句中的 #{} 替換為 ?,再調用PreparedStatement中的set方法進行指派,可以有效防止sql注入,提高系統安全 mybatis處理 ${} 時,會直接替換為變量的值,存在sql注入風險。
resultMap : 描述如何從資料庫結果集中加載對象 sql : sql片段,可被其它語句引用的可重用語句塊 include: 引入sql 片段 selectKey: 對于某些不支援主鍵自增或者可能不支援主鍵自增的JDBC驅動 所引用的政策标簽 動态sql中的 1)if 2)choose, 和其聯用的when,otherwise 3)trim where 5) set 6) foreach 7) script 8) bind
mapper接口的全限名,就是xml映射檔案中namespace的值 接口中的方法名就是 MappedStatement中id的值,方法中的參數,就是傳遞給sql語句中的參數 當調用接口方法時,會以接口全限名 + 方法名拼接的字元串作為 key ,可以唯一确定一個MappedStatement
mapper接口的的工作原理是基于JD動态代理,MyBatis運作時使用JDK動态代理為Mapper接口生成代理對象(proxy),代理對象會攔截該接口中的方法,去執行MappedStatement所代表的sql,然後将sql執行結果傳回
接口中的方法可以重載,但是xml的配置檔案中的ID不可以重複。也就是說重載方法都隻對應一個MappedStatement, 是以要保證,無論調用哪一個重載後的方法,最終的sql語句沒有文法錯誤并能正确執行。
數組分頁: 将查詢出所有符合條件的結果集,再用subList截取結果集進行分頁 sql分頁: 在sql語句中使用limit 進行分頁 攔截器分頁: 攔截所有需要進行分頁的請求,然後在sql語句中統一加上limit 進行分頁 RowBounds分頁: 在接口方法中添加RowBounds對象參數。
邏輯分頁: 将所有滿足條件的資料一次性從資料庫查出加載到記憶體中,在記憶體中在邏輯上進行分頁(數組分頁,RowBounds分頁) 實體分頁:直接特定sql語句,從資料庫中查詢所需要的資料 實體分頁的速度并不一定快于邏輯分頁。
動态sql即在xml映射檔案中,以标簽的形式編寫動态sql,完成邏輯判斷和動态拼接sql的功能 原理 利用OGNL從sql參數對象中計算表達式的值,根據表達式的值動态拼接sql
第一種 使用resultMap标簽,逐一定義列名(column)和對象屬性(property)之間的映射關系 第二種 使用sql列的别名。将列的别名設定為對象的屬性名 有了列名别名之間的映射關系後,MyBatis通過反射建立對象,同時使用反射給對象的屬性指派并傳回
mybatis僅支援association關聯對象和collection關聯集合的延遲加載 通過lazyLoadingEnabled = true/false進行配置
不同的xml映射檔案,如果配置了namespace,id就可以重複。如果每頁配置namespace,id就不能重複。 因為 namespace + id 是作為 Map<String, MappedStatement>中的key使用,如果配置了namespace,namespace不同,即使id相同,namespace + id 也是不同的,保證了key的唯一
一級緩存 作用域為sqlSession,預設開啟 一級緩存失效的情況 在不同的sqlSession中,有着不同的一級緩存 同一個sqlSession中,查詢條件不同 同一個sqlSession兩次查詢期間執行了增删改操作 同一個sqlSession兩次查詢期間手動清空了緩存 二級緩存 作用域為Application, 預設不開啟,需要在配置檔案中設定開啟 開啟二級緩存後,實體類要實作序列化接口,且需要在映射檔案中添加 标簽 ,配置相關屬性,或使用預設配置;并将select标簽中設定useCache = true 二級緩存是多個sqlSession所共享的

繼續閱讀