異常的出現:
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