第二章 SQL對映檔案詳解
第二章 SQL對映檔案詳解
MyBatis框架最具特色的部分是SQL對映。
MyBatis框架主要思想是將SQL語句從程式程式碼中分離出來,對JDBC訪問資料庫的程式碼進行封裝,減少資料訪問層的編碼量。SQL語句和程式碼解耦,對SQL語句的靈活管理,方便SQL語句調優。
SQL 對映檔案中的幾個頂級元素
- mapper:SQL對映檔案的根元素。只有一個namespace,用於區分不同的mapper,必須全域性唯一
- cache:為給定名稱空間配置快取。
- cache-ref:引用其他名稱空間中的快取配置。
- resultMap:用於描述查詢結果集中的欄位和Java實體類屬性的對應關係。
- sql
- insert:對映insert語句
- update:對映update語句
- delete:對映delete語句
- select:對映select語句
命名規則:
- SQL對映檔案與Mapper介面同名(實體類名+Mapper),並放置在同一個包路徑下。檔案型別不一樣
- mapper的namespace一般是要對映的Mapper介面的完全限定名。
- 介面中的方法名與對映檔案中SQL語句的ID一一對應。MyBatis通過namespace+ID確定和介面方法繫結的SQL語句ID。這也就是為什麼可以不通過Mapper介面直接用selectOne 和selectList來讀取值。
- 不同的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 實現多條件查詢
-
將查詢條件封裝成Java物件作為傳參
-
將查詢條件封裝成Map物件作為傳參
存放成一個<String,Object>map物件,String 的值和需要的欄位值需要相同,以及它該賦的值 放進value裡
-
使用@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">