1. 程式人生 > 實用技巧 >第二章 SQL對映檔案詳解

第二章 SQL對映檔案詳解

第二章 SQL對映檔案詳解

MyBatis框架最具特色的部分是SQL對映。

MyBatis框架主要思想是將SQL語句從程式程式碼中分離出來,對JDBC訪問資料庫的程式碼進行封裝,減少資料訪問層的編碼量。SQL語句和程式碼解耦,對SQL語句的靈活管理,方便SQL語句調優

SQL 對映檔案中的幾個頂級元素

  1. mapper:SQL對映檔案的根元素。只有一個namespace,用於區分不同的mapper,必須全域性唯一
  2. cache:為給定名稱空間配置快取。
  3. cache-ref:引用其他名稱空間中的快取配置。
  4. resultMap:用於描述查詢結果集中的欄位和Java實體類屬性的對應關係。
  5. sql
    :定義可重用的SQL程式碼塊,可以在其他語句對映中引用,提高編寫和維護SQL語句的效率。
  6. insert:對映insert語句
  7. update:對映update語句
  8. delete:對映delete語句
  9. select:對映select語句

命名規則:

  1. SQL對映檔案與Mapper介面同名(實體類名+Mapper),並放置在同一個包路徑下。檔案型別不一樣
  2. mapper的namespace一般是要對映的Mapper介面的完全限定名。
  3. 介面中的方法名與對映檔案中SQL語句的ID一一對應。MyBatis通過namespace+ID確定和介面方法繫結的SQL語句ID。這也就是為什麼可以不通過Mapper介面直接用selectOne 和selectList來讀取值。
  4. 不同的SQL對映檔案中,子元素ID可以相同。(因為名稱空間唯一,使用時是名稱空間加上ID也就唯一了)

select 元素

select是MyBatis中最常用的元素之一
select語句有很多屬性可以詳細配置每一條語句
id
名稱空間中唯一的識別符號
介面中的方法與對映檔案中的SQL語句id一一對應
parameterType
傳入SQL語句的引數型別
resultType
SQL語句返回值型別的完整類名或別名

resultMap

描述如何將結果集對映到Java物件

<resultMap type="User" id="userList">
<result property="id" column="id"/>
<result property="userCode" column="userCode"/><!--property裡是實體類的欄位 coliumn是資料庫裡的列-->
<result property="userName" column="userName"/>
<result property="userRole" column=“userRole"/>
<result property="userRoleName" column="roleName"/>
</resultMap>
<select id="getUserList" resultMap="userList" parameterType="User"><!--一個外部resultMap的id,表示返回結果對映到哪一個resultMap上-->
	select u.*,r.roleName from smbms_user u,smbms_role r 
			where u.userName like CONCAT (‘%’,#{userName}, ‘%’)  
			and u.userRole = #{userRole} and u.userRole = r.id 
</select>

resultType :直接表示返回型別
基本資料型別
複雜資料型別
resultMap :對外部resultMap的引用
應用場景:
**資料庫欄位資訊與物件屬性不一致**
==複雜的聯合查詢,自由控制對映結果==

二者不能同時存在,本質上都是Map資料結構

parameterType

基礎資料型別****

int、String、Date等

只能傳入一個,通過#{引數名}即可獲取傳入的值

複雜資料型別

Java實體類、Map等
通過#{屬性名}或者#{map的keyName}即可獲取傳入值

resultMap自動對映匹配前提:欄位名與屬性名一致

resultMap的自動對映級別-autoMappingBehavior

PARTIAL(預設):自動匹配所有

NONE:禁止自動匹配

insert update delete 這類操作,資料庫預設返回執行SQL語句鎖影響的行數,所以Mapper介面的返回一般設定為int型別。者三個元素均沒有resultType/resultMap屬性

insert元素

id parameterType

<insert  id="add" parameterType="User" >
 insert into  smbms_user (userCode,userName,userPassword) 
		values ( #{userCode},#{userName},#{userPassword})
</insert>

update元素

id

parameterType

<update id ="modify" parameterType="User">
update smbms_user set userCode = #{userCode},
	         userName = #{userName},
              userPassword = #{userPassword}  where id = #{id}
</update>

delete元素

id
parameterType

<delete id ="deleteUserById" parameterType="int">
	delete from smbms_user where id = #{id}
</delete>

resultMap屬性

id:resultMap的唯一標識
type:
Java實體類
resultMap子元素
id:一般對應資料庫中該行的主鍵id,設定此項可提高MyBatis效能
result:對映到JavaBean的某個“簡單型別”屬性
association
對映到JavaBean的某個“複雜型別”屬性,比如JavaBean類
collection
對映到JavaBean的某個“複雜型別”屬性,比如集合

association 元素

複雜的型別關聯一對一
內部巢狀
對映一個巢狀JavaBean屬性
屬性
property:對映資料庫列的實體物件的屬性
javaType:完整Java類名或者別名
resultMap:引用外部resultMap
子元素
id
result
property:對映資料庫列的實體物件的屬性
column:資料庫列名或者別名

collection 元素

複雜型別集合,一對多
內部巢狀
對映一個巢狀結果集到一個列表
屬性
property:對映資料庫列的實體物件的屬性
ofType:完整Java類名或者別名(集合所包括的型別)
resultMap:引用外部resultMap
子元素
id
result
property:對映資料庫列的實體物件的屬性
column:資料庫列名或者別名

2.2 MyBatis框架的條件查詢

2.2.1 實現單一條件查詢

在SQL對映的檔案中新增一個新的屬性,parameterType,它表示使用完全限定名或別名,支援基礎資料型別和複雜資料型別。而在被對映的SQL語句中,引數的表示方法為#{引數名},MyBatis會把它轉化成PreparedStatement引數併為其賦值。

除MyBatis框架內建的類型別名,還可以在配置檔案中使用typeAliases元素為自定義的Java型別設定別名。

2.2.2 實現多條件查詢

  1. 將查詢條件封裝成Java物件作為傳參

  2. 將查詢條件封裝成Map物件作為傳參

    存放成一個<String,Object>map物件,String 的值和需要的欄位值需要相同,以及它該賦的值 放進value裡

  3. 使用@Param註解實現多引數傳參

MyBatis快取

一級快取
二級快取

二級快取的配置

MyBatis的全域性cache配置
在Mapper XML檔案中設定快取,預設情況下是沒有開啟快取的
在Mapper XML檔案配置支援cache後,如果需要對個別查詢進行調整,可以單獨設定cache

<cache  type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
<settings>
    <setting name="cacheEnabled" value="true"/>
</settings>
<select id="selectAll" resultType="Emp" 
        useCache="true">