Mybatis-----基礎篇

Mybatis 基礎架構

  1. Mybatis 的基礎架構主要分三層,以下圖所示:

  1. 各層主要功能簡述:

(1)基礎支持層mysql

  • 類型轉換模塊:主要是進行JDBC類型和Java類型之間的轉換
  • 日誌模塊:能夠集成其餘的第三方日誌框架
  • 資源加載模塊:資源加載模塊主要是對類加載器進行封裝,肯定類加載器的使用順序,並提供了加載 類文件以及其餘資源文件的功能
  • 解析器模塊:解析器模塊的主要提供了兩個功能 個功能是對 XPath 進行封裝,爲 MyBatis 初始 化時解析 mybatis-config.xml 配置文件以及映射配置文件提供支持;另外一個功能是爲處理動態SQL 語句中的佔位符提供支持

(2)核心處理層處理數據流程:spring

(3)接口層: 接口層相對簡單,其核心是 SqlSession 接口,該接口中定義了MyBatis 暴露給應用程序調 用的 API ,也就是上層應用與 MyBatis 交互的橋樑。接口層在接收到調用請求時,會調用核心 處理層的相應模塊來完成具體的數據庫操做。sql

Mybatis 基礎問答

  1. 使用$和#的區別:
  • {}是預編譯處理,${}是字符串替換。
  • Mybatis在處理#{}時,會將sql中的#{}替換爲?號,調用PreparedStatement的set方法來賦值;使用#{}能夠有效的防止SQL注入,提升系統安全性。
  • Mybatis在處理${}時,僅僅把${}替換成變量的值。
  1. Mybatis中使用多個參數:
  • 第一種: 使用 arg0 , arg1(以此類推,不建議使用,容易弄混參數)

  • 第二種: 使用 param註解
  1. 獲取自增Id的配置方式

  1. 模糊查詢的方法
  • 第一種:字符串拼接:就是將要查詢的關鍵字keyword,在代碼中拼接好要查詢的格式,如%keyword%,而後直接做爲參數傳入mapper.xml的映射文件中

  • 第二種:使用CONCAT()函數(能夠防SQL注入)

  • 第三種:Mybatis的bind bind 標籤可使用 OGNL 表達式建立一個變量井將其綁定到上下文中。bind 標籤的兩個屬性都是必選項

  1. 批量插入操做方式
  • 第一種:普通for循環插入

  • 第二種:mybatis BATCH模式插入(Mybatis一共有三種模式,Batch爲批量操做),該方式有事務控制。

  • 第三種:動態sql foreach方式插入(無事務控制)

經插入100萬條數據測試後,效率最好爲動態sql foreach循環。數據庫

  1. mybatis 字段命名方式:
  • 數據庫列名的命名規則:緩存

    (1)實體類與數據庫列名相等安全

    (2)符合駝峯命名規則,例如 cityId 對應city_id,必須在配置文件中開啓: (開啓駝峯,開啓後,只要數據庫字段和對象屬性名字母相同,不管中間加多少下劃線均可以識別session

  • 實現實體類中字段名與數據庫字段映射成功的方案mybatis

    (1)打開駝峯式命名配置,或者不開,數據庫列和字段名全一致。架構

    (2)在select語句執行的時候指定別名(AS)app

    (3)使用resultMap 進行一一對應

  1. 分頁
  • 分頁通常分有兩種方式:

    一、物理分頁:即便用數據庫數據庫分頁的方式,如mysql的limit。

    二、邏輯分頁:先查詢出全部數據到內存中,再根據遊標從內存中截取對應的數據,如mybatis 的 RowBounds,這樣效率十分低,數據量大的時候會形成內存溢出。

    MYbatis中的邏輯分頁:

  • Mybatis 中的分頁常使用Github上面的插件PageHelper去進行分頁(實例項目後面會上傳GitHub)
  1. 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的一級緩存失效了。 )

  1. Mybatis 中的Mapper接口中的方法能夠重載嗎?

接口的權限名就是Mapper對應的XML文件中namespace中的值,就是映射文件中MappedStatement的id值。Mapper接口是沒有實現類的,當調用接口方法時,接口全限名+方法名拼接字符串做爲key值,可惟必定位一個MappedStatement,由於根據的是接口權限名+方法名去查找,因此不能重載。Dao接口的工做原理是JDK動態代理,Mybatis運行時會使用JDK動態代理爲Dao接口生成代理proxy對象,代理對象proxy會攔截接口方法,轉而執行MappedStatement所表明的sql,而後將sql執行結果返回。

Mybatis 與 Hibernate的對比

  1. 上手的難易程度,Mybatis來講比較容易掌握,由於其更貼近數據庫,Hibernate則更注重對象與對象之間的關係,要設計好這些關係並不簡單。
  2. 優化的難易程度,因爲Hibernate將對象之間經過配置去表示,優化起來要對Hibernate映射之間的配置十分熟悉,較難優化,Mybatis則只需對sql語句進行調優便可。
  3. 數據庫無關性,Hibernate能夠輕鬆的遷移至不一樣類型的數據庫,只需作細微的修改便可,Mybatis則不行,在某些狀況下可能須要進行重寫sql語句。
相關文章
相關標籤/搜索