【Mybatis】---高级映射之一对多查询

   在上一篇博客中,对mybatis的高级映射----一对一查询进行了讲解.这篇博客中,将在上一篇博客的基础上讲解mybatis的高级映射.表之间的关联关系,详情查看上篇博客.

需求

查询订单及订单明细的信息

sql语句

主表为orders(订单表),关联表为ordersDetail(订单明细表),在一对一查询基础上添加订单明细表关联即可.


SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  orderdetail.items_num,
  orderdetail.orders_id
FROM
  orders,
  USER,
  orderdetail
WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id

修改pojo

在orders中添加list订单明细属性

 private List<Orderdetail> orderdetails;

mapper.xml

 <!-- 查询订单关联查询用户及订单明细,使用resultmap -->
  <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
    SELECT
    orders.*,
    USER.username,
    USER.sex,
    USER.address,
    orderdetail.id orderdetail_id,
    orderdetail.items_id,
    orderdetail.items_num,
    orderdetail.orders_id
    FROM
    orders,
    USER,
    orderdetail
    WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
  </select>

resultMap定义

<!-- 订单及订单明细的resultMap
	使用extends继承,不用在中配置订单信息和用户信息的映射
	 -->
	<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
		<!-- 订单信息 -->
		<!-- 用户信息 -->
		<!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->
		
		
		<!-- 订单明细信息
		一个订单关联查询出了多条明细,要使用collection进行映射
		collection:对关联查询到多条记录映射到集合对象中
		property:将关联查询到多条记录映射到cn.itcast.mybatis.po.Orders哪个属性
		ofType:指定映射到list集合属性中pojo的类型
		 -->
		 <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">
		 	<!-- id:订单明细唯 一标识
		 	property:要将订单明细的唯 一标识 映射到cn.itcast.mybatis.po.Orderdetail的哪个属性
		 	  -->
		 	<id column="orderdetail_id" property="id"/>
		 	<result column="items_id" property="itemsId"/>
		 	<result column="items_num" property="itemsNum"/>
		 	<result column="orders_id" property="ordersId"/>
		 </collection>
		
	
	</resultMap>

mapper.java

  //查询订单及其订单明细
    public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;

总结:

mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

使用resultType实现:

将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

所以在一对多的查询时,建议使用resultMap.

原文地址:https://www.cnblogs.com/chenxiaochan/p/7253428.html