MyBatis 教程:实现一对一查询结果映射的 3 种方法
MyBatis 中实现一对一查询结果映射的 3 种方法:
- 使用别名实现自动映射
- 使用 resultMap 配置
- 使用 resultMap 关联标签配置
1.使用别名自动映射
假设有这样一个需求:根据用户ID请求用户信息,并获取角色为该用户所有。为了举例,我们假设一个用户只能拥有一个 角色(当然不是这种情况)。
一般情况下,不建议直接更改数据库表对应的实体类,所以这里我们新建一个类SysUserExtend,让它继承自SysUser类,并添加一个SysRole型的字段,如如下所示:
package com.zwwhnly.mybatisaction.model;
import java.util.List;
public class SysUserExtend extends SysUser {
/**
* 用户角色
*/
private SysRole sysRole;
public SysRole getSysRole() {
return sysRole;
}
public void setSysRole(SysRole sysRole) {
this.sysRole = sysRole;
}
}
接下来,我们在SysUserMapper接口中添加以下方法:
/**
* 根据用户id获取用户信息和用户的角色信息
*
* @param id
* @return
*/
SysUserExtend selectUserAndRoleById(Long id);
然后在对应的SysUserMapper中添加以下代码。第二点是列别名必须设置为"sysRole.id"
的格式,其中sysRole必须与SysUserExtend类中的字段名一致,id必须与字段名一致。在SysRole课堂上。
最后在SysUserMapperTest测试类中添加如下测试方法:
@Test
public void testSelectUserAndRoleById() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);
// 注意这里使用1001这个用户,因为这个用户只有1个角色
SysUserExtend sysUserExtend = sysUserMapper.selectUserAndRoleById(1001L);
Assert.assertNotNull(sysUserExtend);
Assert.assertNotNull(sysUserExtend.getSysRole());
} finally {
sqlSession.close();
}
}
运行测试代码,测试通过,输出日志如下:
DEBUG [main] - ==> 准备:SELECT u .id, u.user_name 用户名, u.user_password userPassword, u.user_email userEmail, u.create_time createTime, r.id "sysRole.id", r.role_name "sysRole.roleName", r.enabled "sysRole.enabled" , r .create_by "sysRole.createBy", r.create_time "sysRole.createTime" FROM sys_user u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON ur.role_id = r.id WHERE u.id = ?
DEBUG [main ] - ==> 参数:1001(长)
TRACE [main] -
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。