2. 集合-collection
比如同时有User.java和Card.java两个类
User.java如下:
- public class User{
- private Card card_one;
- private List<Card> card_many;
- private Set<Kaike> kaikes= new HashSet<Kaike>();
- }
Card.java如下:
- public class Card implements Serializable{
- private Integer id;
- private String code;
- //省略set和get方法.
- }
综述:
在映射card_one“属性”时用association标签,
映射“card_many” 是一个list的集合对象时用collection标签.
映射kaikes Set类型和list一样的用法(因为list和set同样是继承collection接口的类型所以用法是差不多的)
所以association是用于一对一和多对一,而collection是用于一对多的关系。
Collection和Association实现原理猜测:
假设有这样的三张表:
用户表(User)、身份证表(IDCard)和汽车表(Car)
一个用户有唯一的一张身份证、每张身份证只属于一个用户
一个用户可以有多辆车、一辆车只能属于一个用户
这样的话User表设计时的字段肯定有IDCard表的id、Car表也有User表的id
三表连接后结果用User表封装
User表的pojo里面肯定有IDCard类和List< Car > ,添加映射的时候用associate给iDCard属性配置,用association给 catList配置,那mybatis是怎么实现自动封装User的呢:
- 封装User里面除Collection和Association外的属性(根据id属性列区分不同User)
- 封装完User的一行后取association标签中配置的分装成一个IDCard对象设置给iDCard(其实区分了不同的User后然后在判定为同一个User的所有行中随便取一个就行,都是一样的数据)
- 根据collection中的id列区分不同的List< Car >
总结:只有User的id列能决定有多少行
ps:太绕了,我自己写的都看不懂。。。
再加点东西:
<resultMap id="SSOBeanMap" type="pers.lbw.digitalmall.beans.SSOBean">
<id column="s_s_id" property="sId" />
<!--<result column="s_name" property="sName" />
<result column="s_good_id" property="goodId" />-->
<collection property="s" javaType="Specification">
<result column="s_name" jdbcType="VARCHAR" property="sName" />
<result column="good_id" jdbcType="BIGINT" property="goodId" />
</collection>
<collection property="so" ofType="SpecificationOption" column="so_so_id">
<id column="so_so_id" jdbcType="BIGINT" property="soId" />
<result column="so_name" jdbcType="VARCHAR" property="soName" />
<result column="so_s_id" jdbcType="BIGINT" property="sId" />
<result column="so_good_id" jdbcType="BIGINT" property="goodId" />
<result column="price" jdbcType="INTEGER" property="price" />
</collection>
</resultMap>
<select id="selectSSOByGoodId" parameterType="long" resultMap="SSOBeanMap">
select s.s_id as s_s_id,
s_name,s.good_id as s_good_id,so_id,so_name,so.s_id as so_s_id,so.good_id as so_good_id,price
FROM specification as s INNER JOIN specification_option as so ON s.s_id=so.s_id WHERE s.good_id=#{goodId}
</select>
结论:顶级resultMap(比如这里的SSOBeanMap,直接映射查询结果的resultMap)中必须有一个能确定有多少行的(比如这里的s_s_id),不然就会沦为数据库返回的结果有多少行结果集中就有多少个对象。
association没有去重的作用,看上去去重了只是因为是再User中随便选的。
ps;还是看不懂