MyBatis中多个接口参数的用法
本篇内容
- mapper接口中参数的类型
- mapper接口参数传递给xml,xml如何获取参数值
- @param注解的作用
介绍-参数类型
mapper接口中的参数类型为:
- 基本类型
- JavaBean
mapper中的参数只有一个且为基本类型时,sql语句中只会使用一个参数。当参数是一个JavaBean类型时,它再xml文件中对应的sql语句会有多个参数。
业务中,经常会遇到多个参数(少量)的情况,若将参数合并到一个JavaBean中和分别创建JavaBean都不太方便。因此对于参数比较少的情况,还有两种方式传参
- 使用Map类型
- 使用
@Param
注解
参数-Map类型
Map中通过key来映射XML中SQL使用的参数值名字,value用来存放参数值。
这种方式很少使用。
参数-使用@Param注解
mapper接口定义,未使用@Param
注解
/**
* 根据用户id和角色的enabled状态获取用户的角色
* @param userId
* @param enabled
* @return
*/
List<SysRole> selectRoleByUserIdAndRoleEnabled(Long userId, Integer enabled);
xml定义
<select id="selectRoleByUserIdAndRoleEnabled" resultType="tk.mybatis.simple.model.SysRole">
SELECT
r.id,
r.role_name,
r.enabled,
r.create_by,
r.create_time
FROM
`sys_user` u
INNER JOIN sys_user_role ur ON u.id = ur.user_id
INNER JOIN sys_role r ON r.id = ur.role_id
WHERE
u.id = #{userId}
AND r.enabled = #{enabled}
</select>
测试方法
public void selectRoleByUserIdAndRoleEnabled() {
SqlSession sqlSession = getSqlSession();
try {
SysUserMapper userMapper = sqlSession.getMapper(SysUserMapper.class);
// 调用查询方法
List<SysRole> sysRoles = userMapper.selectRoleByUserIdAndRoleEnabled(1L, 1);
Assert.assertNotNull(sysRoles);
Assert.assertTrue(sysRoles.size()>0);
} finally {
sqlSession.close();
}
}
测试结果,有异常信息org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [0, 1, param1, param2]
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [0, 1, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'userId' not found. Available parameters are [0, 1, param1, param2]
这个错误表示,xml可用的参数只有0、1、param1、param2,没有userId。0、1、param1、param2是MyBatis根据参数位置自定义的名字,如果将xml中的#{userId}改为#{0},#{param1},将#{enabled}改为#{1}、#{param2},就可调用了。
将mapper中接口改为如下
/**
* 根据用户id和角色的enabled状态获取用户的角色
*
* @param userId 用户id主键
* @param enabled 是否启用
* @return 用户角色信息
*/
List<SysRole> selectRoleByUserIdAndRoleEnabled(@Param("userId") Long userId, @Param("enabled") Integer enabled);
重新执行测试方法的结果如下,这时xml文件中对应的sql的可用参数变成了userId,enabled,param1,param2
,如果把#{userId}改为#{param1},把#{enabled}改为#{param2},也可以成功执行
==> Preparing: SELECT r.id, r.role_name, r.enabled, r.create_by, r.create_time FROM `sys_user` u INNER JOIN sys_user_role ur ON u.id = ur.user_id INNER JOIN sys_role r ON r.id = ur.role_id WHERE u.id = ? AND r.enabled = ?
==> Parameters: 1(Long), 1(Integer)
<== Columns: id, role_name, enabled, create_by, create_time
<== Row: 1, 管理员, 1, 1, 2021-01-28 21:58:32.0
<== Row: 2, 普通用户, 1, 1, 2021-01-28 21:58:32.0
<== Total: 2
总结:给参数配置@Param注解后,MyBatis会将参数封装为map类型,@Param注解值作为key。
而当只有一个参数(基本类型)时,MyBatis会直接把唯一的参数值拿来使用,而不必关心参数名。