MyBatis(4)Mybaits一对多查询

快上车快上车,来不及了!
一 订单商品模型

订单关系模型如下
这里写图片描述
具体的内容请看上一篇MyBatis(3)Mybaits一对一查询

二 一对多关联查询

上一篇文章,我们实现了orders表一对一关联查询user表,这里我们实现一下orders表一对多关联查询orderdetail。
orderdetail表对应的外键orders_id是orders的主键id

2.1需求

2.1.1 sql

SELECT 
  orders.*,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  orderdetail.items_num,
  orderdetail.orders_id
FROM
  orders,
  orderdetail
WHERE orders.id=orderdetail.orders_id

查询结果:
这里写图片描述

2.1.2 分析
主表是orders表,并且要求映射不能出现重复记录。
我们可以在orders实体类中添加List< orderDetail > orderDetails属性
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。

2.2实现

2.2.1 orders.java中添加list订单明细属性

public class Orders{

    private Integer id;
    private Integer userId;
    private String number;
    private Date createtime;
    private String note; 
    
    //订单明细
    private List<Orderdetail> orderdetails;
    
    geter/seter...
}

2.2.2 配置文件

	<resultMap type="com.mybatis.po.Orders"    id="OrdersAndOrderDetailResultMap">
		<!-- 订单信息 -->
        <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"/>
		
		<!-- 关联订单明细信息
		一个订单关联查询出了多条明细,要使用collection进行映射
		collection:对关联查询到多条记录映射到集合对象中
		property:将关联查询到多条记录映射到com.mybatis.po.Orders哪个属性
		ofType:指定映射到list集合属性中pojo的类型
		 -->
		 <collection property="orderdetails" ofType="com.mybatis.po.Orderdetail">
		 	<!-- id:订单明细唯一标识,这里在sql中命名是orderdetail_id
		 	property:要将订单明细的唯一标识映射到com.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>

<select id="findOrdersDetailList" resultMap="OrdersAndOrderDetailResultMap">
  SELECT 
    orders.*,
    orderdetail.id orderdetail_id,
    orderdetail.items_id,
    orderdetail.items_num,
    orderdetail.orders_id
  FROM
    orders,
    orderdetail
  WHERE orders.id=orderdetail.orders_id

</select>

2.2.3 mapper.java

public interface UserMapper {

public List<Orders> findOrdersDetailList() throws Exception;
  }

2.2.4 测试

//这里用到Juint单元测试
Public void testfindOrdersDetailList()throws Exception{
		//获取session
		SqlSession session = sqlSessionFactory.openSession();
		//获限mapper接口实例
		UserMapper userMapper = session.getMapper(UserMapper.class);
		//查询订单信息
		List<Orders> list = userMapper.findOrdersDetailList();
		System.out.println(list);
		//关闭session
		session.close();
	}


2.3拓展

实际开发中,在orders一对多orderdetail的基础上,还需要user的信息。
先来写一下对应的sql

<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>

查询结果:
这里写图片描述

对应的resultMap(这时extends就可以大展身手了)

	<resultMap type="com.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
		<!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 -->
		<!-- 这里OrdersUserResultMap对应的是上一篇一对一的id -->
		
		 <collection property="orderdetails" ofType="com.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>
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值