MyBatis学习:高级映射之一对多查询

2021-02-26  本文已影响0人  ApesKingMan

            订单项和订单明细是一对多的关系,所以主要来查询订单表,然后关联订单明细表,这样就有一对多的问题出来了。首先还是先写sql语句,在写sql语句的时候遵循两点:

            查询的主表是哪个? 订单表

            查询的关联表是哪个? 订单明细表

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

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

从结果中可以看出,订单的信息有重复,订单项是不重复的,因为一对多嘛

如果我们用resultType来做映射的话就会出现订单信息的重复,我们不希望出现这个结果,即对orders的映射不能出现重复记录的情况。

需要在Orders.java类中添加一个List<OrderDetail> orderDetails属性来封装订单明细项,最终会将订单信息映射到Orders中,该订单所对应的订单明细映射到Orders中的orderDetails属性中(这跟hibernate中有点类似,如果是hibernate,也会在Orders类中维护一个装OrderDetail的List)。

开始写映射文件

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

这里看到了一个继承,因为订单信息和关联的用户信息和前面一对一是完全一样的,我们就不需要再写一遍了,<resultMap>支持继承,直接继承那个resultMap即可,然后加上订单明细这部分即可。

<collection>是用来处理一对多映射的标签,property属性是Orders.java类中对应的装OrderDetail的List的属性名,就是刚刚定义的那个List,ofType属性表示该List中装的是啥,可以是完全限定名,也可以是别名。然后<collection>里面的标签和属性就和前面一样了,不再赘述。 

然后定义一下mapper接口即可:

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

参考:https://mp.weixin.qq.com/s/CAcdvozeESp99dME7CQYNQ

上一篇下一篇

猜你喜欢

热点阅读