在使用mybatis时经常碰到这些错误:
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'code' in 'class java.lang.String'; (应该是多个参数的情况下会出现)
nested exception is org.apache.ibatis.binding.BindingException: Parameter 'code' not found. Available parameters are [0, 1, param1, param2];
其实都是接口的参数命名导致mybatis参数绑定出错引起的。默认情况下mybatis把参数按顺序转化为[0, 1, param1, param2]
,也就是说#{0} 和 #{param1}
是一样的,都是取第一个参数,以此类推。
下面经过实验验证,首先分两种情况:
-
使用if判断
如果使用了< if test="codee != null and codee !=''">
if判断,那么接口参数就需要加@Param
注解。使用了if判断,mybatis取值的时候参数就成了[param1, codee]
,所以你不得不加注解@Param("codee")
,这个时候不再有0或1了(Available parameters are [param1, codee]
),或者param1… 也可用,比如:< if test="param1 != null and param1 !=''"> and FAULTPOSITION_CODE like CONCAT('%',CONCAT(#{param1,jdbcType=VARCHAR},'%')) ESCAPE '*' < /if>
-
没有使用if判断
这个时候也分两种情况:
(1)接口参数只有一个,不管接口参数名是什么,这个时候#{xxx}没有限制,可以是0,param1,也可以是aaa,bbb。可以不加注解。
(2)当接口参数大于一个的时候,mybatis的参数集就是上边说的默认值[0, 1, param1, param2]
,如果你不用默认值,就需要加上@Param
注解起别名。一旦加了注解,mybatis的参数集就和第一种情况一样了,这个时候也就不再区分是否使用if判断。
mybatis的详细参数转化可以看这个文章:https://my.oschina.net/flags/blog/381199