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);
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>
测试代码
@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(); } }
会报错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);
修改后可以通过测试
这时的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);
这时,在XML中就不能直接使用#{userId}和#{enabled}了,而是要通过点取值方式使用#{user.id}和#{role.enabled}从两个JavaBean中取出指定属性的值。修改好对应的XML文件后,大家可以自行完善代码并进行测试。
除了以上常用的参数类型外,接口的参数还可能是集合或者数组,这种类型的参数暂不讨论
浙公网安备 33010602011771号