高级查询(多对多)

多对多查询

多对多查询是基于一对一和一对多来实现的
多对多查询:通过订单号查询订单,查询出下单人信息并且查询出订单详情以及商品数据。
用户表: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"/>  

猜你喜欢

转载自blog.csdn.net/luoxiao2554/article/details/80443462
今日推荐