09、spring+mybatis

項羽齊發表於2018-03-27

     

MyBatis

1. MyBatis 概述 1-1

1.1. MyBatis 是什麼 1-1

1.2. MyBatis 應用場景 1-1

1.3. MyBatis 核心API以及應用 1-2

2. MyBatis 程式設計基礎 2-3

3. MyBatis 程式設計進階 3-3

4. 總結 4-3

4.1. 重點和難點分析 4-3

4.2. 常見FAQ 4-3

 

1. MyBatis 概述

  1.1. MyBatis 什麼

  MyBatis 是一個優秀持久層框架,由apache的開源專案iBatis演化而來,主要用於解決資料持久化問題,底層實現了對JDBC操作的封裝。

 

1.2. MyBatis 應用場景

 

  首先我們看一張圖,理解mybatis在企業級應用架構中的定位。如下圖所示

 

 

 

 

從這張圖我們可能會看到mybatis為企業級架構中的一個持久層物件,在DAO中進行訪問,用於簡化我們傳統程式設計中相關JDBC程式碼的編寫,例如ORM操作。

 

 

1.3. MyBatis 核心API以及應用

在MyBatis應用中有如何幾個核心角色:

1) Configs(xml) 配置檔案&對映檔案(mapper)

2) SqlSessionFactoryBuilder(載入配置檔案,建立SQLSessionFactory物件)

3) SqlSessionFactory(負責建立session物件)

4) SqlSession(負責執行SQL操作)

 

MyBatis 基於這些核心物件以及配置構建我們的應用程式,其應用過程如下圖所示

 

2. MyBatis 程式設計基礎

2.1. 準備工作

在test資料庫中建立表sys_users;

2.2. 編成步驟

Step01: 建立maven專案(java)

Step02:新增依賴(mybatis,mysql-driver,junit)

Step03: 建立核心配置檔案(mybatis-config.xml)

Step04: 建立SysUserDao介面以及介面對應的對映檔案

Step05:將對映檔案新增到mybatis-config.xml中

Step06: 編寫測試類對介面方法進行單元測試

2.3. 基本實現

 

 

 

2.4. 應用總結

  1. Mybatis 案例程式設計過程以及執行流程?

1) 通過SqlSessionFactory獲取SqlSession物件

2) 通過SqlSession物件獲取介面物件(底層會建立介面實現類物件)

3) 執行介面物件的相關方法(例如查詢)

4) 釋放資源(SqlSession)

  1. MyBatis 介面與對映檔案如何實現對映?

1) 介面的類全名與對映檔案的名稱空間必須一致

2) 介面中方法名與對映檔案中元素的id相同

3) 對於查詢而言對映檔案中元素的resultType的值必須與介面方法有對應。

  1. Mybatis 對映檔案中物件別名的應用。

1) 系統提供了很多預設的物件別名(例如map,int,string,…)

2) 自己定義物件別名(核心配置檔案定義,對映檔案中應用)

3) 在對映檔案的引數型別(parameterType)或者結果型別(resultType)上進行應用

3. MyBatis 程式設計進階

3.1. 對映檔案常用元素

MyBatis 對映檔案中最常用的元素為

1) Select  元素(定義查詢操作)

2) Insert  元素(定義插入操作)

3) Update元素(定義更新操作)

4) Delete 元素(定義刪除元素)

 

以上每個元素在定義時,在指定名稱空間下必須有一個唯一的id。

3.1.1. Select 元素應用

select 元素應用案例

 

<select id="findObjectById"

parameterType=”int”

          resultType="sysUser">

      select *

      from sys_users

      where id=#{id}

</select>

 

對於select元素常用屬性為:

 

1) paramterType 表示引數型別(可寫也可以不寫),其值可以是全類名也可以是別名

2) resultType從這條語句中返回的期望型別的類的完全限定名或別名。注意如果是集合情形,那應該是集合可以包含的型別,而不能是集合本身。

3) resultMap外部 resultMap 的命名引用。結果集的對映是 MyBatis 最強大的特性,在複雜對映的場景下可選擇resultMap.

 

提示resultType&resultMap在應用時只能二者選其一

 

 

 

 

3.2. MyBatis 事務控制

MyBatis 中的事務控制通過SQLSession物件進行控制,當

我們在使用SQLSessionFactory獲取SQLSession物件時,

假如使用的是OpenSession()方法,預設是手動提交事務,對於insert/update/delete操作,這些操作執行完需要手動提交事務,執行SQLSession的Commit方法。

假如需要自動控制事務,可呼叫openSession(true)方法。

 

3.3. MyBatis 中#{},${}表示式

表示式之間的異同點:

相同點:#{}和${}表示式都可以獲取介面方法引數中的資料

不同點:

1)${}表示在獲取介面方法參時,引數需要使用@Param註解進行修飾。

2)${}表示式還可以獲取xxx.properties檔案中的資料

3)${}獲取介面方法引數值時是直接將值拼接在SQL中,這樣可能會存在SQL隱碼攻擊問題。

4)${}假如在SQL語句中應用,應儘量使用引數值替換語句中的表名,欄位名而不是欄位的具體值。

5)#{}mybatis解析sql語句時,發現#號會自動使用?替換,然後用預編譯的PreparedStatement處理此SQL,以提高SQL的執行效能.

6)#{}表示式不會存在SQL隱碼攻擊的問題

 

3.4. MyBatis 中@Param註解應用

如果你的對映器的方法需要多個引數, 這個註解可以被應用於對映器的方法 引數來給每個引數一個名字。否則,多 引數將會以它們的順序位置來被命名 (不包括任何 RowBounds 引數) 比如。 #{param1} , #{param2} 等 , 這 是 默 認 的 。 使 用 @Param(“person”),引數應該被命名為 #{person}