Mybatis----11.06----collection和association

359 阅读2分钟

这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

关于xml里面的collection和association

在我们日常的开发中,mybatis这个持久层框架,可以说普遍率是极其高的,从另一个角度来说;SQL也是后端开发的硬实力,那么,其中所需要的的细节就是考验技巧,今天,简单讲述一下我所理解的collection和association,如有误,敬请指教

collection

collection——集合。一般是作为一对多的时候,延伸出来的集合对象。也就是在写SQL的时候,在面对一对多的时候,使用left join 、inner join 等语句关联时,映射的数据。

  • 举例:

    在班级中,班级与学生是一对多的关系;但是在班级的返回对象中偶尔会需要返回学生的人数,也就是在前端页面展示的时候一并返回给前端。如果选择分成两个请求,那就太浪费资源了,而且分开多次连接数据库也是相当浪费资源。那这个时候就可以用一个请求获取。

    一般是建议用一个VO去重写该实体类,不过也可以图方便 + 一个临时字段

    // 班级表
    public class squad {
     
        private Integer id;
        private String name;
        @Transient
        private Integer studentNum;
    }
    ​
    
    • 在XML上就可以定义一个resultMap去映射,返回的结果就可以实现想要的结果

      ​
      ​
      <resultMap type="bean.squad" id="MySquad">
              <id column="id" property="id"/>
              <result column="name" property="name"/>
              <collection property="studentNum" 
                  ofType="java.lang.Integer" 
                  column="id" 
                  select="findStudentNum">
          </collection>
              </resultMap>
          
              <select id="getSquadById" resultMap="MySquad">
                      SELECT d.id, d.dept_name
                      FROM squad d
                      WHERE d.id = 1
              </select>
          
              <select id="findStudentNum" resultType="java.lang.Integer">
              SELECT
                  count( wb.ID )
              FROM
                  student wb
              WHERE
                  wb.squad = #{id}
          </select>
      
    • 一般来说,我个人使用collection都是作为一对多,利用主键去额外查询关联的集合等,并映射到相应的pojo,达到前端所需要的的数据

association

association —— 关联, 关于 association ,我个人使用的频率并没有那么高。一般是作为多对一的时候,取出关联的数据放到自身身上。

  • 举例 还是那个例子,一个班级和学生对象;假设这次作为学生的页面。需要在学生的页面,额外的展示出班级的名字,这就不需要像刚才那样collection + 额外的SQL;用join方法就可以了

          <resultMap id="studentMap" type="student">
            <id column="id" property="id" />
              <result column="name" property="name"/>
            <association property="squadName" javaType="name">
                <result column="name" property="name" />
            </association>
            </resultMap>
          <select id="findStudent" resultMap="studentMap">
          SELECT
              wb.id,wb.name,s.name
          FROM
              student wb
              inner join squad s on wb.squad_id = s.id
          WHERE
              wb.squad = #{id}
      </select>
    

总结

其实 collection 和 association 并没有分得那么清;从功能上,这两者都是可以互相实现的;具体怎么实现,怎么选型,还得开发者从中学习并实践