注:本文参考自刘增辉老师的《MyBatis从入门到精通》
在关系型数据库中,我们经常要处理一对一、一对多的关系。例如,一辆汽车需要有一个引擎,这是一对一的关系。 一辆汽车有4个或多个轮子,这是一对多的关系。
假设在系统中,一个用户只能拥有一个角色,为了举例,先把用户和角色之间的关系限制为一对一的关系。
1.1 一对一映射
1.1.1 使用自动映射处理一对一关系。
SysUser.java
/**
* 用户
*/
@Data
public class SysUser {
private String id;
private String userName;
private SysRole role;
}
SysRole.java
/**
* 用户角色
**/
@Data
public class SysRole {
private String id;
private String roleName;
private String userId;
}
使用自动映射就是通过别名让 mabatis 自动将值配到对应的字段上,简单的别名映射如user_name 对应 userName 。除此之外,mabatis 还支持复杂的属性映射,可以多层嵌套,例如将role.role_name 映射到 role.roleName 上。 mabatis 会先查找 role 属性,如果存在role属性就创建 role 对象,然后在 role 对象中继续查找 roleName ,将 role_name 的值绑定到 role 对象的roleName 属性上。
<select id="selectUserAndRoleById" resultType="com.zhang.entity.SysUser">
select u.*,r.*
from `sys_user` u
left join `sys_role` r
on u.`id` = r.`user_id`
where u.id = #{id}
</select>
SysUserMapper.java
/**
* 根据用户 id 获取用户信息和用户的角色信息
* @param id
* @return
*/
SysUser selectUserAndRoleById(String id);
1.2 使用 resultMap 配置一对一映射
除了使用 MyBatis 的自动映射来处理一对一嵌套外,还可以在 XML 映射文件中配置结果
映射。我们使用 resultMap 实现上一节中相同的效果。