Code前端首页关于Code前端联系我们

MyBatis 教程:实现一对一查询结果映射的 3 种方法

terry 2年前 (2023-09-25) 阅读数 49 #后端开发

MyBatis 中实现一对一查询结果映射的 3 种方法:

  1. 使用别名实现自动映射
  2. 使用 resultMap 配置
  3. 使用 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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门