解决异常-nested exception is org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found

今天自己在撸代码的时候一时手误,出现了异常,异常信息是:

 

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'roleIdList' not found. Available parameters are [0, 1, param1, param2]
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
    at com.sun.proxy.$Proxy14.insert(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:240)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:51)

 

大概的意思是Mybatis在运行的时候发生了系统异常,此处嵌套了一个参数绑定异常。我们往下看控制台打印的日志会

如下图:

 接着我们找到Cause by 这个关键词后会发现一下信息:

 

可以看到上面提示 roleIdList这个参数没有找到,可用的参数对象是[0, 1, param1, param2],很显然这个问题是我们在Mapper接口中声明方法的时候有多个参数,但是没有使用@Param注解。

于是我们找到Mapper接口中对应的方法,发现真的忘了加@Param注解

 好了,现在我们加上@Param注解即可。

这里解释一下@Param注解的作用,当我们的sql中需要多个参数的时候,Maybatis会将参数列表中的参数封装成一个Map进行传递,这个过程是通过@Param来实现的,@Param注解括号中的值会作为key,value就是参数实际的值。解析参数的时候会按照@Param中定义的key获取对应的值。如上图中所示,MyBatis在运行的时候会将adminId和roleIdList两个参数封装成一个Map,

正确的语法是void insertNewAdminRelationship(@Param("adminId") Integer adminId, @Param("roleIdList") List<Integer> roleIdList);

这样MyBayis传递的是就是一个{"adminId":adminId,"roleIdList":roleIdList}的形式,当sql运行的时候取值的方式就是通过get("roleIdList")来获取值的。

好了,原理就是这么简单,希望对大家有帮助。下次有空的话把这部分的源码和大家分析一遍

  • 62
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值