mybatis高级映射之一对多查询

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

  1. 查询的主表是哪个? 订单表
  2. 查询的关联表是哪个? 订单明细表

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

<span style="color:#000000"><code class="language-sql"><span style="color:#000088 !important">SELECT</span> 
  orders.*,
  <span style="color:#000088 !important">user</span>.<span style="color:#009900 !important">`username`</span>,
  <span style="color:#000088 !important">user</span>.<span style="color:#009900 !important">`sex`</span>,
  <span style="color:#000088 !important">user</span>.<span style="color:#009900 !important">`address`</span>,
  orderdetail.<span style="color:#009900 !important">`id`</span> orderdetail_id,
  orderdetail.<span style="color:#009900 !important">`items_id`</span>,
  orderdetail.<span style="color:#009900 !important">`items_num`</span>,
  orderdetail.<span style="color:#009900 !important">`orders_id`</span>
<span style="color:#000088 !important">FROM</span>
  orders,
  <span style="color:#000088 !important">USER</span>,
  orderdetail 
<span style="color:#000088 !important">WHERE</span> orders.<span style="color:#009900 !important">`user_id`</span>=<span style="color:#000088 !important">user</span>.<span style="color:#009900 !important">`id`</span> <span style="color:#000088 !important">AND</span> orders.<span style="color:#009900 !important">`id`</span> = orderdetail.<span style="color:#009900 !important">`orders_id`</span> </code>
 
 </span>

  这样我们就查询出了订单表中的所有字段,user表和orderdetail表的部分字段,当然也可以查询所有字段,这个根据具体需求来定。看一下查询结果:
查询结果
  从结果中可以看出,订单的信息有重复,订单项是不重复的,因为一对多嘛,这很好理解。所以如果我们用resultType来做映射的话就会出现订单信息的重复,我们不希望出现这个结果,即对orders的映射不能出现重复记录的情况。那么我们就需要在Orders.java类中添加一个List<OrderDetail> orderDetails属性来封装订单明细项(比较简单,代码就不贴了),最终会将订单信息映射到Orders中,该订单所对应的订单明细映射到Orders中的orderDetails属性中(这跟hibernate中有点类似,如果是hibernate,也会在Orders类中维护一个装OrderDetail的List)。
  有了这个思路,接下来就开始写映射文件了。

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

<span style="color:#000000"><code class="language-xml"><span style="color:#006666 !important"><<span style="color:#4f4f4f !important">resultMap</span> <span style="color:#4f4f4f !important">type</span>=<span style="color:#009900 !important">"mybatis.po.Orders"</span> <span style="color:#4f4f4f !important">id</span>=<span style="color:#009900 !important">"OrdersAndOrderDetailResultMap"</span> <span style="color:#4f4f4f !important">extends</span>=<span style="color:#009900 !important">"OrdersUserResultMap"</span>></span>
    <span style="color:#880000 !important"><em><!-- 配置映射订单信息和关联的用户信息和上面的一样,继承上面的即可 --></em></span>
    <span style="color:#880000 !important"><em><!-- 配置关联的订单明细信息 --></em></span>
    <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">collection</span> <span style="color:#4f4f4f !important">property</span>=<span style="color:#009900 !important">"orderdetails"</span> <span style="color:#4f4f4f !important">ofType</span>=<span style="color:#009900 !important">"mybatis.po.Orderdetail"</span>></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">id</span> <span style="color:#4f4f4f !important">column</span>=<span style="color:#009900 !important">"orderdetail_id"</span> <span style="color:#4f4f4f !important">property</span>=<span style="color:#009900 !important">"id"</span>/></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">result</span> <span style="color:#4f4f4f !important">column</span>=<span style="color:#009900 !important">"items_id"</span> <span style="color:#4f4f4f !important">property</span>=<span style="color:#009900 !important">"itemsId"</span>/></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">result</span> <span style="color:#4f4f4f !important">column</span>=<span style="color:#009900 !important">"items_num"</span> <span style="color:#4f4f4f !important">property</span>=<span style="color:#009900 !important">"itemsNum"</span>/></span>
        <span style="color:#006666 !important"><<span style="color:#4f4f4f !important">result</span> <span style="color:#4f4f4f !important">column</span>=<span style="color:#009900 !important">"orders_id"</span> <span style="color:#4f4f4f !important">property</span>=<span style="color:#009900 !important">"ordersId"</span>/></span>
    <span style="color:#006666 !important"></<span style="color:#4f4f4f !important">collection</span>></span>
<span style="color:#006666 !important"></<span style="color:#4f4f4f !important">resultMap</span>></span></code>
 
 </span>

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

<span style="color:#000000"><code class="language-java"><span style="color:#000088 !important">public</span> <span style="color:#000088 !important">interface</span> <span style="color:#4f4f4f !important">UserMapperOrders</span> {

    <span style="color:#880000 !important"><em>//省去不相关代码</em></span>

    <span style="color:#880000 !important"><em>//查询订单(关联用户)及订单明细</em></span>
    <span style="color:#000088 !important">public</span> List<Orders> <span style="color:#009900 !important">findOrdersAndOrderDetailResultMap</span>() <span style="color:#000088 !important">throws</span> Exception;

}</code>
 
 </span>

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

<span style="color:#000000"><code class="language-java"><span style="color:#9b859d !important">@Test</span>
<span style="color:#000088 !important">public</span> <span style="color:#000088 !important">void</span> <span style="color:#009900 !important">testFindOrdersAndOrderDetailResultMap</span>() <span style="color:#000088 !important">throws</span> Exception {
    SqlSession sqlSession = sqlSessionFactory.openSession();
    UserMapperOrders userMapperOrders = sqlSession.getMapper(UserMapperOrders.class);
    List<Orders> list = userMapperOrders.findOrdersAndOrderDetailResultMap();
    System.out.println(list);
}</code>
 
 </span>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis一对一查询是指在数据库中存在一对一关系的两张表,通过MyBatis框架进行查询操作。在一对一查询中,通常会有一个主查询和一个从查询。主查询用于查询主表的数据,而从查询用于查询从表的数据。在执行一对一查询时,查询语句的执行顺序是先执行主查询,然后根据主查询的结果去执行从查询。这样就可以将主表和从表的数据进行关联,返回一个包含主表和从表数据的结果集。 然而,在执行一对一查询时,存在一些问题。一是查询结果中从表的数据可能没有用到。这是因为从表的数据可能只是为了满足关联关系而查询出来的,并不一定会在业务逻辑中使用到。二是在一对一关系中,如果主查询的结果有N个用户,则需要执行N次查询,每次查询都会再次执行从查询,这可能导致性能问题。 为了解决这些问题,可以采用其他方式来进行一对一查询。例如,可以在用户表中设置外键指向博客表,通过外键关联的方式来进行一对一查询。这样就可以在用户实体类中添加一个博客属性,通过映射关系将用户和博客进行关联。 总之,MyBatis一对一查询可以通过主查询和从查询来实现,但也存在一些问题。通过合适的业务逻辑和关联方式,可以解决这些问题,提高查询性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Mybatis高级查询之一对一查询的四种方法(笔记)](https://blog.csdn.net/LeoFitz/article/details/89484688)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值