Mybatis實體關聯對映

波波仔86發表於2019-01-16

原文源自:https://blog.csdn.net/Daybreak1209/article/details/51815753

一、一對一  

1、resultType返回型別:使用resultType返回相對簡單,查詢擴充套件類屬性時,建立擴充套件類。

2、resultMap返回型別:使用resultMap首先需要將1:1關聯實體例如訂單關聯查詢使用者是一對一關係,所以在Order實體中新增單個User物件儲存關聯查詢的使用者資訊。

1)Order Pojo中新增private User user;

2)定義resultMap

需要關聯查詢對映的是使用者資訊,使用association將使用者資訊對映到訂單物件的使用者屬性中。

<!-- 訂單資訊resultmap -->
<resultMap type="cn.itcast.mybatis.po.Orders" id="userordermap">
	<!-- 這裡的id,是mybatis在進行一對一查詢時將user欄位對映為user物件時要使用,必須寫 -->
	<id property="id" column="id"/>
	<result property="user_id" column="user_id"/>
	<result property="number" column="number"/>
	<association property="user" javaType="cn.itcast.mybatis.po.User">
		<!-- 這裡的id為user的id,如果寫上表示給user的id屬性賦值 -->
		<id property="id" column="user_id"/>
		<result property="username" column="username"/>
		<result property="address" column="address"/>
	</association>
</resultMap>

association:表示進行關聯查詢單條記錄
property:表示關聯查詢的結果儲存在cn.itcast.mybatis.po.Orders的user屬性中

javaType:表示關聯查詢的結果型別

<id property="id" column="user_id"/>:查詢結果的user_id列對應關聯物件的id屬性,這裡是<id />表示user_id是關聯查詢物件的唯一標識。

<result property="username" column="username"/>:查詢結果的username列對應關聯物件的username屬性。

3)Mapper對映

<select id="findOrdersListResultMap" resultMap="userordermap">
	SELECT
	orders.*,
	user.username,
	user.address
	FROM
	orders,	user
	WHERE orders.user_id = user.id 
</select>

4)mapper.java介面

public List<Orders> findOrdersListResultMap() throws Exception;

5)測試

Public void testfindOrdersListResultMap()throws Exception{
		//獲取session
		SqlSession session = sqlSessionFactory.openSession();
		//獲限mapper介面例項
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//查詢訂單資訊
		List<Orders> list = userMapper.findOrdersList2();
		System.out.println(list);
		//關閉session
		session.close();
	}

二、一對多 
例如根據訂單查詢訂單詳情關聯資訊order 與OrderDetail類

1、Order 實體中新增OrderDetail的List實體集

     在Orders類中加入List<Orderdetail> orderdetails屬性

2、定義ResultMap 

<!-- 訂單資訊resultmap -->
<resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap">
	<id property="id"column="id"/>
	<result property="user_id" column="user_id"/>
	<result property="number" column="number"/>
	<association property="user" javaType="cn.itcast.mybatis.po.User">
		<id property="id" column="user_id"/>
		<result property="username" column="username"/>
		<result property="address" column="address"/>
	</association>
	<collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
		<id property="id" column="orderdetail_id"/>
		<result property="items_id" column="items_id"/>
		<result property="items_num" column="items_num"/>
	</collection>
</resultMap>

resultMap的繼承:

如果應用到User的實體關聯查詢,上邊一對一查詢訂單及使用者資訊定義的resultMap相同,可以省去association關聯,將使用者中定義的resultMap直接套用繼承,優化如下:

<resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap">
	<collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
		<id property="id" column="orderdetail_id"/>
		<result property="items_id" column="items_id"/>
		<result property="items_num" column="items_num"/>
	</collection>
</resultMap>
//使用extends="userordermap" 繼承userodermap

3、Mapper對映

<select id="findOrdersDetailList" resultMap="userorderdetailmap">
	SELECT
	orders.*,
	user.username,
	user.address,
	orderdetail.id orderdetail_id,
	orderdetail.items_id,
	orderdetail.items_num
	FROM orders,user,orderdetail
	WHERE orders.user_id = user.id
	AND orders.id = orderdetail.orders_id
</select>

總結:使用collection完成一對多關聯查詢,將關聯查詢資訊對映到集合物件。
三、多對多
     在Mybaits中,一對多查詢是多對多查詢的特例,1:n中使用一個collectin元素完成關聯對映,而n:n中使用collection巢狀,表示多條記錄對映到多條查詢。例如使用者關聯訂單、訂單詳情、商品資訊。

1、pojo擴充套件
     在User中新增List<Orders> orders 屬性,在Orders類中加入List<Orderdetail> orderdetails屬性

2、定義ResultMap 
 

<resultMap type="cn.itcast.mybatis.po.User" id="userOrderListResultMap">
	 	<id column="user_id" property="id"/>
		<result column="username" property="username"/>
	 	<collection property="orders" ofType="cn.itcast.mybatis.po.Orders">
	           <id  column="id" property="id"/>
	           <result property="number" column="number"/>
	     	     <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
	     	 	<id  column="orderdetail_id" property="id"/>
	      		<result property="ordersId" column="id"/>
	     		<result property="itemsId" column="items_id"/>
	      		<result property="itemsNum" column="items_num"/>
	      		<association property="items" javaType="cn.itcast.mybatis.po.Items">
		  			 <id column="items_id" property="id"/>
		   			 <result column="items_name" property="name"/>
		   			 <result column="items_detail" property="detail"/>
			</association>
	   	     </collection>
	        </collection>
	 </resultMap>

在訂單collection中新增訂單詳情collection表示訂單與訂單詳情的多對多關係。

 

相關文章