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

MyBatis教程:使用关联标签实现嵌套查询

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

讲解如何使用关联标签实现嵌套查询。

1。找出需求

继续上一篇博客的需求:根据用户名查询用户信息,得到用户角色信息(假设一个员工只能有一个角色)。

在上一篇博客中,我们使用了3种方式来实现这个需求,但这三个需求有一个共同点,那就是我们使用了多表查询,即通过查询一次就得到了我们想要的东西数据库。信息。

有同学说我不喜欢多表查询方式。当数据量很大时,会影响性能。这么简单的需求我可以分为两步。第一步是基于用户名。请求用户的信息以及用户的角色ID(仍然需要连接表,但是连接从3张表减少到2张表)。第二步,根据第一步向角色信息询问的角色ID进行调查。

当然这个方法是可以的,这个逻辑可以用业务代码来实现。不过,我们在这篇博客中不会讨论这个方法,而是通过关联标签来实现它。

2。实现方法

由于我们需要根据角色的id查询角色的信息,因此我们首先需要在SysRoleMapper.xml中添加以下查询:

<select id="selectRoleById" resultMap="roleMap">
    SELECT * FROM sys_role WHERE id = #{id}
</select>

这里的角色映射是我们在上一篇博客中定义的角色映射。代码如下:

<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>

然后在 SysUserMapper 接口中添加以下方法:

/**
 * 根据用户id获取用户信息和用户的角色信息,嵌套查询方式
 *
 * @param id
 * @return
 */
SysUserExtend selectUserAndRoleByIdSelect(Long id);

然后在对应的 SysUserMapper.xml 文件中添加以下代码:

<resultMap id="userRoleMapSelect" type="com.zwwhnly.mybatisaction.model.SysUserExtend" extends="sysUserMap">
    <association property="sysRole"
                 select="com.zwwhnly.mybatisaction.mapper.SysRoleMapper.selectRoleById"
                 column="{id=role_id}"/>
</resultMap>
<select id="selectUserAndRoleByIdSelect" resultMap="userRoleMapSelect">
    SELECT  u.id,
            u.user_name,
            u.user_password,
            u.user_email,
            u.user_info,
            u.head_img,
            u.create_time,
            ur.role_id
    FROM sys_user u
    INNER JOIN sys_user_role ur ON u.id = ur.user_id
    WHERE u.id = #{id}
</select>

可以注意到我们添加了 com.zwwhnly 标签到select=”组合。mybatisaction.mapper.SysRoleMapper.selectRoleById”指的是我们在SysRoleMapper.xml中定义的查询。

还添加了column="{id=role_id}",这里的id是com.zwwhnly.mybatisaction.mapper.SysRoleMapper.selectRoleById,和value_RoleById的名称必须相同因为最后一列在上面的查询中保持不变。

注意:如果有多个参数,可以使用格式column="{id=role_id,name=role_name}"。? username => 参数:1001(长)

TRACE [main] - 参数:2(长)

TRACE [main] -

版权声明

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

发表评论:

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

热门