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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM