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

MyBatis教程:如何使用集合标签实现查询结果的一对多映射

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

如何在MyBatis中使用集合标签实现查询结果的一对多映射。

1。使用采集标签

需求:根据用户ID查询用户信息,获取用户拥有的角色s。一名用户可以拥有一个或多个角色。

一般情况下,不建议直接更改数据库表对应的实体类。

所以这里我们继续使用上一篇博客中新建的类SysUserExtend,并添加如下代码,如下所示:

/**
 * 用户的角色集合
 */
private List<SysRole> sysRoleList;

public List<SysRole> getSysRoleList() {
    return sysRoleList;
}

public void setSysRoleList(List<SysRole> sysRoleList) {
    this.sysRoleList = sysRoleList;
}

然后我们在SysUserMapper接口中添加如下方法:

/**
 * 获取所有的用户以及对应的所有角色
 *
 * @return
 */
List<SysUserExtend> selectAllUserAndRoles();

接下来,在对应的SysUserMapper.xml中添加如下代码:

<resultMap id="userRoleListMap" type="com.zwwhnly.mybatisaction.model.SysUserExtend" extends="sysUserMap">
    <collection property="sysRoleList" columnPrefix="role_"
                ofType="com.zwwhnly.mybatisaction.model.SysRole">
        <id property="id" column="id"/>
        <result property="roleName" column="role_name"/>
        <result property="enabled" column="enabled"/>
        <result property="createBy" column="create_by"/>
        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
    </collection>
</resultMap>

因为我们在上一篇博客中已经构建了角色表的角色映射:

<resultMap id="roleMap" type="com.zwwhnly.mybatisaction.model.SysRole">
    <id property="id" column="id"/>
    <result property="roleName" column="role_name"/>
    <result property="enabled" column="enabled"/>
    <result property="createBy" column="create_by"/>
    <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
</resultMap>

所以上面的程序集标签可以简化为:

<collection property="sysRoleList" columnPrefix="role_"
            resultMap="com.zwwhnly.mybatisaction.mapper.SysRoleMapper.roleMap">
</collection>

来创建对应的查询代码到界面,使用上面新建的userRoleListMap,如下图:

<select id="selectAllUserAndRoles" resultMap="userRoleListMap">
    SELECT
        u.id,
        u.user_name,
        u.user_password,
        u.user_email,
        u.create_time,
        r.id role_id,
        r.role_name role_role_name,
        r.enabled role_enabled,
        r.create_by role_create_by,
        r.create_time role_create_time
    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
</select>

最后在SysUserMapperTest测试类中添加如下测试方法:

@Test
public void testSelectAllUserAndRoles() {
    SqlSession sqlSession = getSqlSession();

    try {
        SysUserMapper sysUserMapper = sqlSession.getMapper(SysUserMapper.class);

        List<SysUserExtend> sysUserList = sysUserMapper.selectAllUserAndRoles();
        System.out.println("用户数:" + sysUserList.size());
        for (SysUserExtend sysUser : sysUserList) {
            System.out.println("用户名:" + sysUser.getUserName());
            for (SysRole sysRole : sysUser.getSysRoleList()) {
                System.out.println("角色名:" + sysRole.getRoleName());
            }
        }
    } finally {
        sqlSession.close();
    }
}

运行测试代码,测试通过,输出日志如下:

DEBUG [main] - ==> 准备: SELECT u.id, u.user_name, u.user_password, u.user_email, u.create_time, r.id role_id, r.role_name role_role_name, r.enabled role_enabled, r.create_by role_create_by, r.create_time role_create_us syr ON JONER syyON _user_user u.id = ur .user_id INNER JOIN sys_role r ON ur.role_id = r.id

DEBUG [main] - ==> 参数:

TRACE [main] -

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

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

热门