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>

猜你喜欢

转载自blog.csdn.net/m0_37293461/article/details/81164024