深入浅出-@Param在多参数情况的使用及原理

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} //成功取到值
经验分享 程序员 微信小程序 职场和发展