mybatis中多对多关系collection标签的使用

124 篇文章 2 订阅
13 篇文章 0 订阅

collection字面翻译为集合之意,Java项目开发中常遇到多对多关系的结果,例如,如一个用户可以有多个订单,每个订单可以有多个订单商品,每个商品对应有一个卖家,查询结果中如果某两个对象是多对多关系,一般使用collection标签,可以一次性查出所有数据即所需表字段,通过resultMap结果映射到对应的实体的类变量中,用法例子如下:

<resultMap id="map01" type="User">
    <id column="..." property="..."/>
    <result column="..." property="...">
    ...
    <!--用户和订单为一对多关系-->
    <collection property="数据类型为Order在User中的数据列表的类变量名称" ofType="Order">
        <id column="..." property="..."/>
        <result column="..." property="...">
        ...
        <!--订单和订单商品为多对多关系-->
        <collection property="数据类型为OrderDetail在Order中的数据列表的类变量名称" ofType="OrderDetail">
            <id column="..." property="..."/>
            <result column="..." property="...">
            ...
            <!--订单商品和卖家为一对一关系-->
            <association property="数据类型为Vender在OrderDetail中的类变量名称" javaType="Vender">
                <id column="..." property="..."/>
                <result column="..." property="...">
                ...
            </association>
        </collection>
    </collection>
</resultMap>

<select id="select01" parameterType="Java某数据类型" resultMap="map01">
    select ...最多查询出User,Order,OrderDetail,Vender各个实体所对应的所有字段 
    from table1 (,table2,inner/left/jion tableX on ... )
    where ... 
    order by ...
</select>

说明:分别有类User,Order,OrderDetail,Vender,id为select01的SQL语句所查询的结果映射到 map01 的对应User对象的各类变量中,因map01中使用两个collection标签,其外层collection的property属性指定User中的数据类型为Order数据列表的类变量,ofType属性指定Java数据类型为Order,同理,内层collection的property属性指定Order中的数据类型为OrderDetail数据列表的类变量,ofType属性指定Java数据类型为OrderDetail,最内部通过association标签每个订单商品对应的商家进行一对一关联,也即一次性查出所有字段数据然后通过map01进行映射(到相应各个类的类变量),同时使用collection,association标签把各个对象的一对多,多对多,一对一的关系进行关联和映射到相应各个类的类变量;

其中 collection,association 是否可用外部子查询方式获取相关数据列表,没验证过,依据前面一对多关系的实现方式推想应该是可以的;

个人简单总结,可能有错漏之处,欢迎拍照留言指点讨论...
 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis ,我们可以使用 collection 标签来实现一对多的查询。具体实现步骤如下: 1. 在主实体类定义一个 List 类型的属性,用于存储多个从实体类对象。 2. 在主实体类对应的 Mapper.xml 文件使用 collection 标签来映射从实体类对象的集合。 3. 在 collection 标签使用 select 属性来指定查询从实体类对象的 SQL 语句,并使用 resultMap 属性来指定从实体类对象的映射关系。 例如,我们有一个 Order 实体类和一个 OrderItem 实体类,一个订单可以对应多个订单项。那么我们可以在 Order 实体类定义一个 List<OrderItem> 类型的属性,然后在 Order 对应的 Mapper.xml 文件使用 collection 标签来映射 OrderItem 对象的集合,具体代码如下: ``` <!-- OrderMapper.xml --> <select id="getOrderById" resultType="Order"> select * from orders where id = #{id} </select> <resultMap id="orderResultMap" type="Order"> <id property="id" column="id"/> <result property="orderNo" column="order_no"/> <collection property="orderItems" ofType="OrderItem" select="getOrderItemsByOrderId"/> </resultMap> <select id="getOrderItemsByOrderId" resultType="OrderItem"> select * from order_items where order_id = #{id} </select> ``` 在上面的代码,我们定义了一个名为 orderResultMap 的 resultMap,其使用collection 标签来映射 OrderItem 对象的集合。在 collection 标签,我们使用 select 属性来指定查询 OrderItem 对象的 SQL 语句,并使用 ofType 属性来指定集合元素的类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值