这是我参与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 并没有分得那么清;从功能上,这两者都是可以互相实现的;具体怎么实现,怎么选型,还得开发者从中学习并实践