2.6、多个接口参数的用法

2.6、多个接口参数的用法

 

在前面的例子,所有接口方法都只有一个参数,比如一个string类型的id,或者是一个JavaBean如SysUser

当要传输多个参数的时候,有2种好用的方法:1、使用Map类型作为参数;2、使用@Param注解

使用Map类型作为参数的方法,就是在Map中通过key来映射XML中SQL使用的参数值名字,value用来存放参数值,需要多个参数时,通过Map的key-value方式传递参数值,由于这种方式还需要自己手动创建Map以及对参数进行赋值,其实并不简洁,所以对这种方式只做以上简单介绍,接下来着重讲解使用@Param注解的方式

使用@Param注解

1、一个错误的例子

接口方法

/**
 * 根据用户 id 和 角色的 enabled 状态获取用户的角色
 * 
 * @param userId
 * @param enabled
 * @return
 */
List<SysRole> selectRolesByUserIdAndRoleEnabled(Long userId, Integer enabled);
View Code

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
    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>
View Code

测试代码

@Test
public void testSelectRolesByUserIdAndRoleEnabled() {
    SqlSession sqlSession = getSqlSession();
    try {
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        // 调用 selectRolesByUserIdAndRoleEnabled 方法查询用户的角色
        List<SysRole> roleList = userMapper.selectRolesByUserIdAndRoleEnabled(1L, null);
        // 结果不为空
        Assert.assertNotNull(roleList);
        // 角色数量大于 0 个
        Assert.assertTrue(roleList.size() > 0);
    } finally {
        // 不要忘记关闭 sqlSession
        sqlSession.close();
    }
}
View Code

会报错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},这个方法就可以被正常调用了。这样讲只是为了让大家理解它们之间的关系,但实际上并不建议这么做

2、使用@Param注解

修改接口方法即可

/**
 * 根据用户 id 和 角色的 enabled 状态获取用户的角色
 * 
 * @param userId
 * @param enabled
 * @return
 */
List<SysRole> selectRolesByUserIdAndRoleEnabled(@Param("userId") Long userId, @Param("enabled") Integer enabled);
View Code

修改后可以通过测试

这时的XML文件中对应的SQL的可用参数变成了[userId,enabled,param1,param2],如果把#{userId}改为#{param1},把#{enabled}改为#{param2},测试也可以通过

给参数配置@Param注解后,MyBatis就会自动将参数封装成Map类型,@Param注解值会作为Map中的key,因此在SQL部分就可以通过配置的注解值来使用参数。

到这里大家可能会有一个疑问:当只有一个参数(基本类型或拥有TypeHandler配置的类型)的时候,为什么可以不使用注解?这是因为在这种情况下(除集合和数组外),MyBatis不关心这个参数叫什么名字就会直接把这个唯一的参数值拿来使用。

当参数是JavaBean的时候,如

/**
 * 根据用户 id 和 角色的 enabled 状态获取用户的角色
 * 
 * @param user
 * @param role
 * @return
 */
List<SysRole> selectRolesByUserAndRole(@Param("user")SysUser user, @Param("role")SysRole role);
View Code

这时,在XML中就不能直接使用#{userId}和#{enabled}了,而是要通过点取值方式使用#{user.id}和#{role.enabled}从两个JavaBean中取出指定属性的值。修改好对应的XML文件后,大家可以自行完善代码并进行测试。
除了以上常用的参数类型外,接口的参数还可能是集合或者数组,这种类型的参数暂不讨论

 

posted @ 2018-02-28 17:32  LiveYourLife  阅读(621)  评论(0)    收藏  举报