Collection和Association的区别

1. 关联-association

2. 集合-collection

比如同时有User.java和Card.java两个类

User.java如下:

[java]  view plain  copy
  1. public class User{  
  2.         private Card card_one;  
  3.         private List<Card> card_many;  
  4.         private Set<Kaike> kaikes= new HashSet<Kaike>();
  5. }  

Card.java如下:

[java]  view plain  copy
  1. public class Card implements Serializable{  
  2.     private Integer id;  
  3.     private String code;  
  4.         //省略set和get方法.  
  5. }  

综述:

在映射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的呢:

  1. 封装User里面除Collection和Association外的属性(根据id属性列区分不同User)
  2. 封装完User的一行后取association标签中配置的分装成一个IDCard对象设置给iDCard(其实区分了不同的User后然后在判定为同一个User的所有行中随便取一个就行,都是一样的数据)
  3. 根据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;还是看不懂

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值