背景:比如有一个接口方法selectByUserIdAndEnabled(Long userId, Integer enabled)。需要用userId和enabled去关联查用户权限信息。
接口如下:
/**
* 通过用户ID和权限开关查询用户拥有的角色
* @param id
* @return
*/
List<SysRole> selectByUserIdAndEnabled(Long userId, Integer enabled);
mapper.xml配置如下:
<!-- 通过用户ID和权限开关查询用户拥有的角色(测试多参数接口使用) -->
<select id="selectByUserIdAndEnabled" resultType="ex.mybatis.rbac.model.SysRole">
select r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_email as 'user.userEmail'
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 = #{userId} and r.enabled = #{enabled}
</select>
如果直接这样用会报错,提示找不到参数’userId’,并且给出了合法的参数为[arg1, arg0, param1, param2],如下:
解决这个问题有3种方法:
1、把参数改为Mybatis默认的参数[arg0, argX, param1, paramX](X对应参数个数);(不推荐)
2、把参数封装为一个JavaBean,然后把接口参数改为这个JavaBean;(不推荐)
3、接口参数上使用@Param注解;(推荐)
1. 把参数改为[arg0, arg1]或[param1, param2],用法如下:
- [arg0, arg1]方式
<!-- 通过用户ID和权限开关查询用户拥有的角色(测试多参数接口使用) -->
<select id="selectByUserIdAndEnabled" resultType="ex.mybatis.rbac.model.SysRole">
select r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_email as 'user.userEmail'
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 = #{arg0} and r.enabled = #{arg1}
</select>
- [param1, param2]方式
<!-- 通过用户ID和权限开关查询用户拥有的角色(测试多参数接口使用) -->
<select id="selectByUserIdAndEnabled" resultType="ex.mybatis.rbac.model.SysRole">
select r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_email as 'user.userEmail'
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 = #{param1} and r.enabled = #{param2}
</select>
2. 将多个参数合并到一个JavaBean,并使用这个JavaBean作为接口方法的参数。这种方法用起来很方便,但是不适合所有的情况。因为不可能只为了两三个参数去创建新的JavaBean类,因此对于参数较少的情况不推荐使用这种方式。
- 把参数Long userId, Integer enabled封装成一个JavaBean
JavaBean,RoleQueryParam类:
public class RoleQueryParam {
private Long userId;
private Integer enabled;
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public Integer getEnabled() {
return enabled;
}
public void setEnabled(Integer enabled) {
this.enabled = enabled;
}
}
接口定义:
/**
* 通过用户ID和权限开关查询用户拥有的角色(参数封装成JavaBean)
* @param roleQueryParam
* @return
*/
List<SysRole> selectByUserIdAndEnabledJB(RoleQueryParam roleQueryParam);
XML配置:
<!-- 通过用户ID和权限开关查询用户拥有的角色(参数封装成JavaBean) -->
<select id="selectByUserIdAndEnabledJB" resultType="ex.mybatis.rbac.model.SysRole">
select r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_email as 'user.userEmail'
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 = #{userId} and r.enabled = #{enabled}
</select>
测试代码,调用部分:
// 调用selectByUserIdAndEnabledJB方法
RoleQueryParam roleQueryParam = new RoleQueryParam();
roleQueryParam.setUserId(1001L);
roleQueryParam.setEnabled(1);
List<SysRole> roles = roleMapper.selectByUserIdAndEnabledJB(roleQueryParam);
3. 使用@Param注解,这种方式Mybatis就会自动将参数封装成Map类型,@Param注解的值会作为Map中的key,因此就可以在SQL部分直接使用了。
- 使用参数的注解
接口定义:
/**
* 通过用户ID和权限开关查询用户拥有的角色(使用注解传参)
* @param id
* @return
*/
List<SysRole> selectByUserIdAndEnabledUseAn(@Param("userId") Long userId, @Param("enabled") Integer enabled);
XML配置:
<!-- 通过用户ID和权限开关查询用户拥有的角色(使用注解传参) -->
<select id="selectByUserIdAndEnabledUseAn" resultType="ex.mybatis.rbac.model.SysRole">
select r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_email as 'user.userEmail'
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 = #{userId} and r.enabled = #{enabled}
</select>
- 使用JavaBean注解
接口定义:
/**
* 通过用户ID和权限开关查询用户拥有的角色(使用JavaBean传参)
* @param id
* @return
*/
List<SysRole> selectByUserIdAndEnabledUseBean(@Param("user") SysUser user, @Param("role") SysRole role);
XML配置:
<!-- 通过用户ID和权限开关查询用户拥有的角色(使用javaBean传参) -->
<select id="selectByUserIdAndEnabledUseBean" resultType="ex.mybatis.rbac.model.SysRole">
select r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_email as 'user.userEmail'
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 = #{user.id} and r.enabled = #{role.enabled}
</select>