问题描述
使用mybatis中,报错”-nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘XXX’ not found“
mapper中的配置如下:
"<if test='rep.status != null and rep.status!=\"\"'> and t1.status=#{status} </if>"
mapper入参为:
List<QcHeader> getInfoAll(QcHeader rep);
且入参的rep对象中,是有status属性的。
问题解决
看报错的意思是:mybatis的参数绑定错误,
最终发现:Sql忘了引用注解里设定的名称,mybatis不知道QcHeader对象怎么解析出#{staus}参数,会直接被标记为status参数名,但实际没有。
改为如下后,正常。#{req.status}
"<if test='rep.status != null and rep.status!=\"\"'> and t1.status=#{req.status} </if>"
原理
@Param:
用于java参数向sql参数的映射。
给java参数起名字,后续拼接sql时根据注解指定的名字引用。pojo与数据库的映射。来自mybatis,持久层的注解。
使用场景:
- 入参是一个参数:可不写。
- 入参是多个简单类型参数:多个@Param分别映射参数。如果不写,则默认按参数顺序匹配。
- 入参是pojo的:1个映射即可;取值#{email});估计是java方法入参pojo对象就是转化就是映射的目标,否则默认map。
- 入参是Map的:1个映射即可,#{key值}
参考:
《MyBatis]sql多参数处理/@Param/POJO/Map》: https://blog.csdn.net/qq_38277033/article/details/80903469
《Mybatis中@Param注解详细使用和原理分析》: https://blog.csdn.net/stefwu/article/details/82802978
《org.apache.ibatis.binding.BindingException: Parameter ‘xxx’ not found异常处理》: https://blog.csdn.net/zhou373986278/article/details/88998758