问题:接口中的方法的参数不止一个的情况,如何将参数注入到sql语句中,这里有两种解决方案:
① 使用Map类型作为参数(比较繁琐,不学习)
② 使用@Param注解
先看看两个参数出现的问题:
在UserMapper.java中定义如下方法:
/**
* 根据userId和enabled的状态获取用户的角色
*
* 疑问:为什么一个参数的时候不使用@param注解呢?
* 这是因为一个参数(除集合和数组外),mybatis不关心这个参数叫什么名字
* 就会直接把这个唯一的参数值拿来使用
* @param userId
* @param enabled
* @return
*/
List<SysRole> selectRolesByUserIdAndRoleEnabled (Long userId, Integer enabled);
UserMapper.xml对应的配置如下:
<select id="selectRolesByUserIdAndRoleEnabled" resultType="tk.mybatis.simple.model.SysRole">
SELECT
r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_name AS "user.userName",
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>
测试代码如下:
@Test
public void testSelectRolesByUserIdAndRoleEnabled() {
SqlSession sqlSession = getSqlSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<SysRole> list = userMapper.selectRolesByUserIdAndRoleEnabled(1L,1);
//sysUser不为空
Assert.assertNotNull(list);
//用户名为admin
Assert.assertTrue(list.size()>0);
}finally {
sqlSession.close();
}
}
测试结果有bug:
Cause: org.apache.ibatis.binding.BindingException: Parameter ‘userId’ not found. Available parameters are [arg1, arg0, param1, param2]
如何修改?
将
where u.id = #{userId} AND r.enabled = #{enabled}
修改为
where u.id = #{arg0} AND r.enabled = #{arg1}
或者修改为:
where u.id = #{param1} AND r.enabled = #{param2}
就可以正常执行了。但这并不是我们想要的结果。修改接口中的方法为如下代码,使用@Param注解
List<SysRole> selectRolesByUserIdAndRoleEnabled
(@Param("userId") Long userId, @Param("enabled") Integer enabled);
配置文件不做修改,测试通过。。
参数类型时基本数据类型,如上使用即可。但是参数为JavaBean时,用法稍有不同。
在UserMapper.java中定义方法:
/**
* 根据userId和enabled的状态获取用户的角色
* @param user
* @param role
* @return
*/
List<SysRole> selectRolesByUserAndRole(
@Param("user") SysUser user, @Param("role") SysRole role);
UserMapper.xml对应的配置如下(注意where条件语句的编写):
<select id="selectRolesByUserAndRole" resultType="tk.mybatis.simple.model.SysRole">
SELECT
r.id,
r.role_name roleName,
r.enabled,
r.create_by createBy,
r.create_time createTime,
u.user_name AS "user.userName",
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>
测试代码:
@Test
public void testSelectRolesByUserAndRole() {
SqlSession sqlSession = getSqlSession();
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
SysUser user = new SysUser();
user.setId(1L);
SysRole role = new SysRole();
role.setEnabled(1);
List<SysRole> list = userMapper.selectRolesByUserAndRole(user,role);
//sysUser不为空
Assert.assertNotNull(list);
//用户名为admin
Assert.assertTrue(list.size()>0);
}finally {
sqlSession.close();
}
}
测试结果略去。。
其他情况:参数类型为集合或者数组,后面讨论。。。