MyBatis多参数情况下的处理
当UserMapper.java
如下形式向数据映射器UserMapper.xml
传递参数
User login(String username,String password);
此时MyBatis将参数username和参数password分别解析为数据arg1, arg0, param1, param2
结论:
情况一:
在MyBatis中,如果传入参数大于等于2时,且不被@Param注解指定别名的情况下,传入的参数会按照从左到右的顺序解析为arg0,arg1,arg2…arg n-1 (n为参数个数) 和 param1,param2,param3…param n (n为参数个数)
1、arg0和arg1,即格式为arg+从0开始数字
的值。
2、param1和param2,即格式为param+从1开始数字
的值。
情况二:
当传递一个基本数据类型或及其包装类(不是数组、List集合形式)参数时,使用#{param_name}
接收,无论param_name的值和方法参数名称是否对应,都能找到值并成功传入;
User login(String username); // Mapper接口中
#{xsxsa} //UserMapper.xml中成功获取值
特殊情况:
如果是
User login(String username); // Mapper接口中
<if test="username != null">
#{xxx}
</if>
是无法获取到值的,原因如下:
因为此时动态SQL的if的条件test中存在username,此处必须为username取别名,否则将回去java.lang.String中去找getUsername(),所以我们应该这样写
// Mapper接口中
User login(@Param("name") String username);
<if test="name != null">
#{name}
</if>
而使用${param_name}
接收参数的值时,必须在方法形参上用@Param指定别名,在${param_name}
中使用别名才能成功传入参数。
User login(@Param("name") String username); // Mapper接口中
${name} //UserMapper.xml中成功获取值
情况三:
当传递一个 List 对象或数组对象参数给 MyBatis 时,MyBatis 会自动把它包装到一个 Map 中,此时: List 对象会以 list
作为 key,数组对象会以array
作为 key,也可以使用注解 @Param 设置 key 名。
User login(List<User> user); // Mapper接口中
#{list} //UserMapper.xml中成功获取值
User login(User[] user); // Mapper接口中
#{array} //UserMapper.xml中成功获取值
@Param注解详解
@Param(“key”)设置的值key将被加入Mybatis自动解析的Map中,即:
User login(String username,String password);
Mybatis自动解析的Map参数列表为[arg0,arg1,param1,param2]
加上@Param注解后
User login(@Param("name") String username,@Param("pwd") String password);
Mybatis自动解析的Map参数列表为[arg0,arg1,param1,param2,name,pwd]
在UserMapper中使用 获取参数不支持把简单类型参数作为值,因为 获取参数不支持把简单类型参数作为值,因为 获取参数不支持把简单类型参数作为值,因为{}会去寻找传入的参数属于的类中是否存在参数名的getter和setter,如果传入的是Long类型、String类型,它也会去寻找值,例如下面:
User login(String username);
${username} // ${}会取到java.lang.String中寻找getUsername()方法,肯定是找不到的
用@Param注解解决,如下:
User login(@Param("name") String username);
${name} //成功取到值