From《MyBatis从入门到精通》
<!-- 6.1.2.1 collection集合的嵌套结果映射 和association类似,集合的嵌套结果映射就是指通过一次SQL查询将所有的结果查询 出来,然后通过配置的结果映射,将数据映射到不同的对象中去。在一对多的关系中,主 表的一条记录对对应关联表中的多条数据,因此一般查询时会查询多个结果,按照一对多 的数据结构存储数据的时候,最终的结果数会小于等于查询的总记录数。 --> <resultMap id="userRoleListMap" type="tk.mybatis.simple.model.SysUser" extends="userMap"> <id property="id" column="id"/> <result property="userName" column="user_name"/> <result property="userPassword" column="user_password"/> <result property="userEmail" column="user_email"/> <result property="userInfo" column="user_info"/> <result property="headImg" column="head_img"/> <result property="createTime" column="create_time"/> <collection property="roleList" columnPrefix="role_" javaType="tk.mybatis.simple.model.SysRole"> <id property="id" column="id"/> <result property="roleName" column="role_name"/> <result property="enabled" column="enabled"/> <result property="createBy" column="create_by"/> <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/> </collection> </resultMap> <!--最终简化版本--> <resultMap id="userRoleListMap" extends="userMap" type="tk.mybatis.simple.model.SysUser"> <collection property="roleList" columnPrefix="role_" resultMap="tk.mybatis.simple.mapper.RoleMapper.roleMap"/> </resultMap> <!-- 解读: 我忽视了一个问题,数据库呈现查询结果是通过记录数~~~ 通过日志可以清楚的看到,SQL执行的结果数有3条,后面输出的用户数是2,也就是说 本来查询出的3条结果经过MyBatis对collection数据处理后,变成了两条。一个用户 拥有多个角色,查询到的记录中,是通过记录数呈现的。但是MyBatis又怎么知道要处理 成这样的结果呢? 先来看看MyBatis是如何知道要合并admin的两条数据的: MyBatis在处理结果的时候,会判断结果是否相同,如果相同的结果,则只会保留第一个结果 所以这个问题的关键点就是MyBatis如何判断结果是否相同。MyBatis判断结果是否相同时, 最简单的情况就是在映射配置中至少有一个id标签: <id property="id" column="id"> 我们对id(构造方法中为idArg)的理解一般是,它配置的字段为表的主键(联合主键时可以配置 多个id标签),因为MyBatis的resultMap只用于配置结果如何映射,并不知道这个表的具体如何。 id的唯一作用就是在嵌套的映射配置时判断数据是否相同,当配置id标签时,MyBatis只需要逐条 比较所有数据中id标签配置的字段值是否相同即可。在配置嵌套结果查询时,配置id标签可以提高 处理效率。 --> <!-- 6.1.2.2 collection集合的嵌套查询 -->