Mybatis 基礎架構
- Mybatis 的基礎架構主要分三層,以下圖所示:
- 各層主要功能簡述:
(1)基礎支持層:mysql
- 類型轉換模塊:主要是進行JDBC類型和Java類型之間的轉換
- 日誌模塊:能夠集成其餘的第三方日誌框架
- 資源加載模塊:資源加載模塊主要是對類加載器進行封裝,肯定類加載器的使用順序,並提供了加載 類文件以及其餘資源文件的功能
- 解析器模塊:解析器模塊的主要提供了兩個功能 個功能是對 XPath 進行封裝,爲 MyBatis 初始 化時解析 mybatis-config.xml 配置文件以及映射配置文件提供支持;另外一個功能是爲處理動態SQL 語句中的佔位符提供支持。
(2)核心處理層處理數據流程:spring
(3)接口層: 接口層相對簡單,其核心是 SqlSession 接口,該接口中定義了MyBatis 暴露給應用程序調 用的 API ,也就是上層應用與 MyBatis 交互的橋樑。接口層在接收到調用請求時,會調用核心 處理層的相應模塊來完成具體的數據庫操做。sql
Mybatis 基礎問答
- 使用$和#的區別:
- {}是預編譯處理,${}是字符串替換。
- Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;使用#{}能夠有效的防止SQL注入,提升系統安全性。
- Mybatis在處理${}時,僅僅把${}替換成變量的值。
- Mybatis中使用多個參數:
- 第一種: 使用 arg0 , arg1(以此類推,不建議使用,容易弄混參數)
- 第二種: 使用 param註解
- 獲取自增Id的配置方式
- 模糊查詢的方法
- 第一種:字符串拼接:就是將要查詢的關鍵字keyword,在代碼中拼接好要查詢的格式,如%keyword%,而後直接做爲參數傳入mapper.xml的映射文件中
- 第二種:使用CONCAT()函數(能夠防SQL注入)
- 第三種:Mybatis的bind bind 標籤可使用 OGNL 表達式建立一個變量井將其綁定到上下文中。bind 標籤的兩個屬性都是必選項
- 批量插入操做方式
- 第二種:mybatis BATCH模式插入(Mybatis一共有三種模式,Batch爲批量操做),該方式有事務控制。
- 第三種:動態sql foreach方式插入(無事務控制)
經插入100萬條數據測試後,效率最好爲動態sql foreach循環。數據庫
- mybatis 字段命名方式:
-
實現實體類中字段名與數據庫字段映射成功的方案mybatis
(1)打開駝峯式命名配置,或者不開,數據庫列和字段名全一致。架構
(2)在select語句執行的時候指定別名(AS)app
(3)使用resultMap 進行一一對應
- 分頁
- Mybatis 中的分頁常使用Github上面的插件PageHelper去進行分頁(實例項目後面會上傳GitHub)
- Mybatis的一級緩存
- mybatis的一級緩存是sqlsession級別的緩存,sqlsession只能訪問本身的一級緩存的數據,mybatis默認是支持一級緩存的,不須要任何配置便可使用。
- 同一個sqlsession再次發出相同的sql,就從緩存中取不走數據庫。若是兩次中間出現commit操做(修改、添加、刪除),本sqlsession中的一級緩存區域所有清空,下次再去緩存中查詢不到因此要從數據庫查詢,從數據庫查詢到再寫入緩存。
- mybatis和spring整合後進行mapper代理開發,不支持一級緩存,mybatis和spring整合,spring按照mapper的模板去生成mapper代理對象,模板中在最後統一關閉sqlsession (mybatis與spring整合一級緩存失敗的緣由: 1.mybatis的一級緩存生效的範圍是sqlsession,是爲了在sqlsession沒有關閉時,業務須要重複查詢相同數據使用的。一旦sqlsession關閉,則由這個sqlsession緩存的數據將會被清空。 2.spring對mybatis的sqlsession的使用是由template控制的,sqlsession又被spring看成resource放在當前線程的上下文裏(threadlocal),spring經過mybatis調用數據庫的過程以下:
經過以上步驟後發現,同一線程裏面兩次查詢同一數據所使用的sqlsession是不相同的,因此,給人的印象就是結合spring後,mybatis的一級緩存失效了。 )
- Mybatis 中的Mapper接口中的方法能夠重載嗎?
接口的權限名就是Mapper對應的XML文件中namespace中的值,就是映射文件中MappedStatement的id值。Mapper接口是沒有實現類的,當調用接口方法時,接口全限名+方法名拼接字符串做爲key值,可惟必定位一個MappedStatement,由於根據的是接口權限名+方法名去查找,因此不能重載。Dao接口的工做原理是JDK動態代理,Mybatis運行時會使用JDK動態代理爲Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行MappedStatement所表明的sql,而後將sql執行結果返回。
Mybatis 與 Hibernate的對比
- 上手的難易程度,Mybatis來講比較容易掌握,由於其更貼近數據庫,Hibernate則更注重對象與對象之間的關係,要設計好這些關係並不簡單。
- 優化的難易程度,因爲Hibernate將對象之間經過配置去表示,優化起來要對Hibernate映射之間的配置十分熟悉,較難優化,Mybatis則只需對sql語句進行調優便可。
- 數據庫無關性,Hibernate能夠輕鬆的遷移至不一樣類型的數據庫,只需作細微的修改便可,Mybatis則不行,在某些狀況下可能須要進行重寫sql語句。