搜索
您的当前位置:首页正文

【MyBatis学习09】高级映射之一对多查询

来源:好走旅游网

我的个人博客站点:

  上一篇博文总结了一下一对一的映射,本文主要总结一下一对多的映射,从上一篇文章中的映射关系图中可知,订单项和订单明细是一对多的关系,所以本文主要来查询订单表,然后关联订单明细表,这样就有一对多的问题出来了。
  首先还是先写sql语句,在写sql语句的时候遵循两点:

  明确了主表和关联表,下面就可以写sql了,我们在上一节的sql基础上添加订单明细表的关联即可。

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 orders.`id` = orderdetail.`orders_id` 

  这样我们就查询出了订单表中的所有字段,user表和orderdetail表的部分字段,当然也可以查询所有字段,这个根据具体需求来定。看一下查询结果:

<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 orders.`id` = orderdetail.`orders_id` 
</select>

  所以我们要定义一个名为OrdersAndOrderDetailResultMap的resultMap,如下:

<resultMap type="mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
    <!-- 配置映射订单信息和关联的用户信息和上面的一样,继承上面的即可 -->
    <!-- 配置关联的订单明细信息 -->
    <collection property="orderdetails" ofType="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>

  这里看到了一个继承,因为订单信息和关联的用户信息和前面一对一是完全一样的,我们就不需要再写一遍了,<resultMap>支持继承,直接继承那个resultMap即可,然后加上订单明细这部分即可。
  <collection>是用来处理一对多映射的标签,property属性是Orders.java类中对应的装OrderDetail的List的属性名,就是刚刚定义的那个List,ofType属性表示该List中装的是啥,可以是完全限定名,也可以是别名。然后<collection>里面的标签和属性就和前面一样了,不再赘述。
  然后定义一下mapper接口即可:

public interface UserMapperOrders {

    //省去不相关代码

    //查询订单(关联用户)及订单明细
    public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;

}

  到此位置,一对多的映射就写好了,下面测试一下:

@Test
public void testFindOrdersAndOrderDetailResultMap() throws Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapperOrders userMapperOrders = sqlSession.getMapper(UserMapperOrders.class);
    List<Orders> list = userMapperOrders.findOrdersAndOrderDetailResultMap();
    System.out.println(list);
}

  一对多就总结到这吧,下一篇博文将总结一下mybatis中多对多映射。
  

文末福利:“程序员私房菜”,一个有温度的公众号~


—–乐于分享,共同进步!
—–我的博客主页:

因篇幅问题不能全部显示,请点此查看更多更全内容

Top