一对多数据库
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
角色名称:普通用户mybatis
1、id标签也能够配置多个,好比联合主键时
2、极可能也会出现没有配置id的状况,这时MyBatis就会把resultMap中全部字段进行比较,若是全部字段的值都相同就合并,只要有一个字段值不一样,就不合并。这时,当结果集字段数为M,记录数N,最少M×N次比较,相比配置id时的N次比较,效率相差更多,因此要尽量配置id标签。
3、在嵌套结果配置id属性时若是查询语句中没有查询id属性配置的列,就会致使id对应的值为null。这种状况下,全部值的id都相同,所以会使嵌套的集合中只有一条数据。因此在配置id列时,查询语句中必须包含该列。app
collection 支持的属性以及属性的做用和association 彻底相同。虽然association和collection标签是分开介绍的,可是这二者能够组合使用或者互相嵌套使用,也可使用符合本身须要的任何数据结构,不须要局限于数据库表之间的关联关系。测试