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

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 是否可用外部子查询方式获取相关数据列表,没验证过,依据前面一对多关系的实现方式推想应该是可以的;

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

猜你喜欢

转载自blog.csdn.net/shenzhenNBA/article/details/86504809