一对多

MyBatis的resultMap只用于配置结果如何映射,id的唯一作用就是在嵌套的映射配置时判断数据是否相同,当配置id标签时,MyBatis只需要逐条比较所有数据中id标签字段值是否相同即可,可以提高处理效率。

为了更清楚地理解id 的作用,可以临时对userMap 的映射进行如下修改。

<resultMap id="userMap" type="test.mybatis.simple.model.SysUser">

<id property="userPassword" column="user_password"/>

<result property="userName" column="user_name"></result>

<result property="id" column="id"></result>

<result property="userEmail" column="user_email"></result>

<result property="userInfo" column="user_info"></result>

<result property="headImg" column="head_img" jdbcType="BLOB"></result>

<result property="createTime" column="create_time" jdbcType="TIMESTAMP"></result>

</resultMap>

<resultMap id="userRoleListMap" extends="userMap" type="SysUser">

<collection property="roleList" columnPrefix="role_" resultMap="test.mybatis.simple.mapper.RoleMapper.roleMap"/>

</resultMap>

在测试数据中,用户的密码都是123456 ,因此如果用密码作为id,所有结果将合并为1条数据。

用户数: 1

用户名:admin

角色名:管理员

角色名:普通用户

对比之前的正确结果,可以看到角色记录也合并了

用户数:2

用户名:admin

角色名称:管理员

角色名称:普通用户

用户名:test

角色名称:普通用户

1、id标签也可以配置多个,比如联合主键时

2、很可能也会出现没有配置id的情况,这时MyBatis就会把resultMap中所有字段进行比较,如果所有字段的值都相同就合并,只要有一个字段值不同,就不合并。这时,当结果集字段数为M,记录数N,最少M×N次比较,相比配置id时的N次比较,效率相差更多,所以要尽可能配置id标签。

3、在嵌套结果配置id属性时如果查询语句中没有查询id属性配置的列,就会导致id对应的值为null。这种情况下,所有值的id都相同,因此会使嵌套的集合中只有一条数据。所以在配置id列时,查询语句中必须包含该列。


collection 支持的属性以及属性的作用和association 完全相同。虽然association和collection标签是分开介绍的,但是这两者可以组合使用或者互相嵌套使用,也可以使用符合自己需要的任何数据结构,不需要局限于数据库表之间的关联关系。