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

原文地址:https://www.cnblogs.com/tdyang/p/12717933.html