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

12 篇文章 1 订阅

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} //成功取到值
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君去何方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值