多对多查询
多对多查询是基于一对一和一对多来实现的
多对多查询:通过订单号查询订单,查询出下单人信息并且查询出订单详情以及商品数据。
用户表:tb_ser 订单表:tb_order 订单详情表:tb_orderdetail 商品表:tb_item
思路:
- 订单:用户 = 1:1 (体现在pojo对象中就是在Order对象中添User对象)
- 订单:订单详情 = 1 : n(体现在pojo对象中就是在Order对象中添加OrderDetail对象的集合)
- 订单详情:商品 = 1 : 1(体现在pojo对象中就是在OrderDetail对象中添加Item对象)
编写statement
<resultMap type="Order" id="orderUserDetailItemMap" autoMapping="true">
<id property="id" column="id"/>
<!-- 对一查询User -->
<association property="user" javaType="User" autoMapping="true">
<!--
property="id":关联对象的主键的属性名称
column:关联对象在当前表中的外键的字段名称,如果重复,可以使用别名或者外键名称
-->
<id property="id" column="uid"/>
</association>
<!-- 对多查询Orderdetail -->
<collection property="detailList" javaType="List" ofType="Orderdetail">
<!--
property="id":关联对象的主键的属性名称
column:关联对象在表中的主键名称,如果重复,可以使用别名
-->
<id property="id" column="detail_id"/>
<!-- 通过Orderdetail对一查询Item -->
<association property="item" javaType="Item" autoMapping="true">
<!--
property:item的主键的属性名称
column:表中主键的字段名称,如果重名,可以使用别名,或者外键名称
-->
<id property="id" column="iid"/>
</association>
</collection>
</resultMap>
<select id="queryOrderAndUserAndOrderdetailAndItemByOrderNumber" resultMap="orderUserDetailItemMap">
select *,od.id as detail_id,u.id as uid,i.id as iid from tb_order o
inner join tb_user u on o.user_id = u.id
inner join tb_orderdetail od on o.id = od.order_id
inner join tb_item i on od.item_id = i.id
where o.order_number = #{number}
</select>
collection标签和association标签可以互相嵌套使用
autoMapping=”true”添加自动映射,一旦涉及到嵌套查询,需要手动设置为true(通常采用这种方式)。但也可mybatis-config.xml中的setting配置中配置如下属性:<setting name="autoMappingBehavior" value="FULL"/>