MyBatis教程:使用关联标签实现嵌套查询
讲解如何使用关联标签实现嵌套查询。
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的名称必须相同因为最后一列在上面的查询中保持不变。
注意:如果有多个参数,可以使用格式 TRACE [main] - 参数:2(长) TRACE [main] - column="{id=role_id,name=role_name}"
。? username => 参数:1001(长)
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。