複習之MyBatis基礎用法(二)——ResultMap用法詳解
阿新 • • 發佈:2018-12-13
ResultMap – 是最複雜也是最強大的元素
它就是讓你遠離 90%的需要從結果集中取出資料的 JDBC 程式碼的那個東西, 而且在一些情形下允許你做一些 JDBC 不支援的事情。事實上, 編寫相似於對複雜語句聯合對映這些等同的程式碼, 也許可以跨過上千行的程式碼。 ResultMap 的設計就是簡單語句不需要明確的結果對映,而很多複雜語句確實需要描述它們的關係。
半自動對映
當資料庫某些欄位名稱和實體類屬性命名不同時候(大小寫不同不需要,因為sql語句不分大小寫),可以使用ResultMap讓實體類和欄位名對映
- property:指定物件的屬性名
- javaType:指定要對映的物件的型別。
<resultMap type="Orders" id="orders"> <!-- 可以半自動對映 只寫不同的 --> <result column="user_id" property="userId"/> <!-- 主鍵配id,可以提高MyBatis效能 --> <!-- 手動對映 <id column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <result column="createtime" property="createtime"/> <result column="note" property="note"/> --> </resultMap> <select id="selectOrdersList" resultMap="orders"> Select id,user_id,number,createtime,note from orders </select>
複雜結果對映
聯表查詢是需要得到一個複雜結果的資料,需要ResultMap把需要的資料對映
一對一關聯查詢
- association專門用來建立1對1關聯關係。
<!-- 一對一關聯查詢 --> <resultMap type="Orders" id="order"> <result column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <!-- Order內裡面還有一個類變數user,並且order與user是一對一的關係 --> <!-- javaType="User"指明類變數的型別 --> <!-- 類變數的屬性一一對映 --> <association property="user" javaType="User"> <id column="user_id" property="id"/> <result column="username" property="username"/> </association> </resultMap> <!-- 第二種方式--> <resultMap type="User" id="userMap"> <id column="user_id" property="id"/> <result column="username" property="username"/> </resultMap> <resultMap type="Orders" id="order"> <result column="id" property="id"/> <result column="user_id" property="userId"/> <result column="number" property="number"/> <!-- 類變數直接對映層一個map --> <association property="user" javaType="User" resultMap="userMap"/> </resultMap> <!-- 查詢語句 --> <select id="selectOrders" resultMap="order"> select o.id,o.user_id,o.number,o.createtime, u.username from orders o left join e_user u on o.user_id = u.id </select>
上述的實體類
public class Orders implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
//附件物件
private User user;
//get、set方法省略
一對多關聯查詢
- collection專門用來建立1對1關聯關係。
<resultMap type="User" id="UserAddressMap">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<!-- 一個人有多個地址 -->
<collection property="addressList" ofType="Address">
<id property="id" column="aId"/>
<result property="postCode" column="postCode"/>
<result property="contact" column="contact"/>
<result property="addressDesc" column="addressDesc"/>
</collection>
</resultMap>
<!-- 第二種方式 -->
<resultMap type="Address" id="AddressMap">
<id property="id" column="aId"/>
<result property="postCode" column="postCode"/>
<result property="contact" column="contact"/>
<result property="addressDesc" column="addressDesc"/>
</resultMap>
<resultMap type="User" id="UserAddressMap2">
<id property="id" column="id"/>
<result property="userCode" column="userCode"/>
<result property="userName" column="userName"/>
<!-- 一個人有多個地址 -->
<collection property="addressList" ofType="Address" resultMap="AddressMap"/>
</resultMap>
<!-- 查詢語句 -->
<select id="getUserByUserId3" resultMap="UserAddressMap2">
select u.*,a.id aId,a.postCode,a.contact,a.addressDesc from smbms_user u inner join smbms_address a
on u.id = a.userId
where u.id = #{userId}
</select>
上述實體類
public class User {
private Integer id; //id
private String userCode; //使用者編碼
private String userName; //使用者名稱稱
private String userPassword; //使用者密碼
private Integer gender; //性別
private Date birthday; //出生日期
private String phone; //電話
private String address; //地址
private Integer userRole; //使用者角色
private String userRoleName;
//角色物件
private Role role;
//地址集合物件
private List<Address> addressList;
private Integer createdBy; //建立者
private Date creationDate; //建立時間
private Integer modifyBy; //更新者
private Date modifyDate; //更新時間
//get、set方法省略