Mybatis入门系列之(四)——接口多参数

问题:接口中的方法的参数不止一个的情况,如何将参数注入到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();
        }
    }

测试结果略去。。

其他情况:参数类型为集合或者数组,后面讨论。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值