Mybatis报错: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]解决方案及问题根源

造成此问题的原因通常是Dao层的方法含有多个参数

 

废话不多说,先上解决方案

  • 解决方案一:在参数前加上@Param注解

  • 解决方案二:修改idea设置

                           File->Settings->Build,Execution,Deployment->Compiler->Java Compiler

                           在 Additional command line parameters: 后面填上 -parameters

                           重新编译项目 搞定!

                           注: 该解决方案的前提是你的java必须是8以上,Mybatis必须是3.4.1版本以上

 


看到这里,大部分人已经解决了问题.。下面来说一说为什么会出现这样的问题:

首先,我们来看看Mybatis的官方手册

@Param

If your mapper method takes multiple parameters, this annotation can be applied to a mapper method parameter to give each of them a name. Otherwise, multiple parameters will be named by their position prefixed with "param" (not including any RowBounds parameters). For example #{param1}, #{param2} etc. is the default. With @Param("person"), the parameter would be named #{person}.

 意思是如果你的mapper方法中有多个参数, 你可以使用注解@Param给你的参数一个别名(供sql语句中使用), 否则的话你的参数将会以"param"为前缀 后面跟上参数的位置作为别名.

例如 #{param1}, #{param2},这个是默认值。如果注解是 @Param("person"),那么参数就会被命名为 #{person}。


那么,为什么在idea中加上-parameters配置就可以不加注解了呢?

我们再来看下官方手册,

useActualParamName=true

Allow referencing statement parameters by their actual names declared in the method signature. To use this feature, your project must be compiled in Java 8 with -parameters option. (Since: 3.4.1) 

官方手册说自Mybatis3.4.1版本后, 允许使用方法签名中实际的参数名作为他们的别名,也就是说在有个参数的方法中,你不再需要添加@Param注解便可以直接在sql语句中使用参数本身的名字。为了使用这个特性,有个很重要的前提:你的项目必须采用Java8编译并且加上 -parameters 选项。

有些idea版本较低,所以需要手动添加 -parameters选项。在新版本的idea中会自动添加该选项(如下图),这也就是为什么有的时候代码在你的电脑上可以跑,在别人的电脑上需要加上@Param注解才能跑的原因。

 


下面来看下Mybatis源码:

使用实际参数名的配置是默认启用的,如下图

也就是说,你无需加@Param注解,它默认就按照实际参数名与表达式匹配。如果你加了@Param注解,那么就会覆盖掉这个参数名,比如有参数 int id,实际参数名就是“id”,若加上了@Param(“userId”),userId就会覆盖掉id,实际参数名就是"userId"

 

 

下图是通过在调用mapper方法的语句上打断点进去的,

args数组里面是你给参数传的值,比如id的值为1,password的值为“123456”,names是一个装着实际参数名的map。如下图

此处new了一个map类型的param用来装参数名称和对应参数值

1是添加实际参数名,如参数 int id ,若没加@param注解,添加的实际参数名是“id”,若加上@Param(“userId”),添加的就是“userId”;

2是添加的通用参数名,也就是param1,param2

在map中既添加了实际参数名,又添加了通用参数名。因此,在写sql时,即可以使用#{id}(未加@Param注解)或者是#{userId}(添加了@Param("userId)注解),也可以使用#{param1},这两种方式都可以。

 

 

  • 9
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值