1. 程式人生 > >複習之MyBatis基礎用法(二)——ResultMap用法詳解

複習之MyBatis基礎用法(二)——ResultMap用法詳解

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方法省略