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 是否可用外部子查询方式获取相关数据列表,没验证过
,依据前面一对多关系的实现方式推想应该是可以的;
个人简单总结,可能有错漏之处,欢迎拍照留言指点讨论…