mybatis Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
异常的出现:
mapper层接口
public interface EmpMapper { public Emp getEmpByIdAndName(Integer id ,String name); }
xml:sql语句
<select id="getEmpByIdAndName" resultType="com.mybatis.bean.Emp" databaseId="mysql"> select * from emp where id = #{id} and name = #{name} </select>
进行测试时,出现上述异常
在mybatis中:
1》单个参数:mybatis不会做特殊处理,#{参数名/任意名}:取出参数值。如:
public Emp getEmpById(Integer id);
<select id="getEmpById" resultType="com.mybatis.bean.Emp" databaseId="mysql"> select * from emp where id = #{id} </select>
2》多个参数:mybatis会做特殊处理。多个参数会被封装成 一个map,key:param1...paramN,或者参数的索引也可以,value:传入的参数值,
#{}就是从map中获取指定的key的值;按照异常提示可用参数为 [0, 1, param1, param2],如:
public Emp getEmpByIdAndName(Integer id ,String name);
<select id="getEmpByIdAndName" resultType="com.mybatis.bean.Emp" databaseId="mysql"> select * from emp where id = #{0} and name = #{1} </select>
或者:
<select id="getEmpByIdAndName" resultType="com.mybatis.bean.Emp" databaseId="mysql"> select * from emp where id = #{param1} and name = #{param2} </select>
但是上面的处理不能见名知意,可以在接口处使用@Param注解,明确的指定参数封装成map中的key
public Emp getEmpByIdAndName(@Param("id") Integer id , @Param("name") String name);
这时候就可以在xml文件中可以使用指定的参数名:
<select id="getEmpByIdAndName" resultType="com.mybatis.bean.Emp" databaseId="mysql"> select * from emp where id = #{id} and name = #{name} </select>
我们传入两个以上参数的时候,一般会将参数自己封装成对象。
当我们传入一个集合或数组时,也是需要明确指定参数名,否则也会出现类似上面错误的异常,如
mybatis Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [collection, list]
补充:在官方文档的settings中,使用useActualParamName属性 , java8加上-parameters参数就可以实现在多参数时不用@Param注解
idea中配置-parameters