Mybatis使用foreach報錯:
org.apache.ibatis.binding.BindingException: Parameter 'busiOrderNoList' not found. Available parameters are [collection, list]
mapper.java類如下
public List<PayrollTradenoPay2CDTO> findTradeInfoForBusiOrderId(List<String> busiOrderNoList);
mapper.xml如下:使用了foreach
<if test="busiOrderNoList!=null ">
and pt.busi_order_no in
<foreach item="item" index="index" collection="busiOrderNoList" open="(" separator="," close=")">
#{item}
</foreach>
</if>
這裏報錯是找不到參數"busiOrderNoList",看來mapper.java的參數並沒傳進來.
默認情況下(沒有指定parameterType時),Mybatis把參數按順序轉化爲#{0},#{1}或者#{param0}#{param1}有以下三種情況
(1)當只有一個參數時,並且沒有參數中沒有if判斷時,可以指定參數#{aaa}或者#{0}或者隨便#{xxxx}都可以獲取值.
(2)當有兩個以上參數時,並且沒有參數中沒有if判斷時.指定參數名#{aaa}#{bbb}或者#{0}#{1}獲取不到值,報錯
Parameter '0' not found. Available parameters are [arg1, arg0, param1, param2],按照提示替換爲#{arg0}#{arg1}或者#{param0}#{param1}就可以了.
(3)當有if時,只能用默認的參數名#{arg0}#{arg1}或者#{param0}#{param1}.如果不想用默認的,只能加@Param指定參數名.
當前問題有兩種解決方式:
1.按照報錯提示,將xml裏的參數busiOrderNoList改爲list或者collection
<if test="list!=null ">
and pt.busi_order_no in
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</if>
2. 在mapper.java中添加@Param("busiOrderNoList")註解.如下..
public List<PayrollTradenoPay2CDTO> findTradeInfoForBusiOrderId(@Param("busiOrderNoList") List<String> busiOrderNoList);
Mybatis的參數綁定用法有好幾種.下面介紹常用的3種.
-
使用對象傳遞參數.適用於參數比較多.xml需要指定parameterType
//mapper.java List<BizProcessDataEntity> findFinishTaskList(ProcessTaskQueryParam processTaskQueryParam); //mapper.xml 此時需要指定參數類型.比如(parameterType="com.ali.dto.param.ProcessTaskQueryParam" ) #{map裏的key}
-
使用@Param傳遞參數.適用於單個參數,或者少數幾個參數.不必指定parameterType
public List<PayrollTradenoPay2CDTO> findTradeInfoForBusiOrderId(@Param("busiOrderNoList") List<String> busiOrderNoList);
這裏有個注意點.@Param相當於給參數指定了參數名.所以xml裏面必須使用指定的名字,按名字匹配參數.和其它兩種不一樣,可以不必指定parameterType
3.使用map傳遞參數.比如 Map<String, Object> queryMap,map的value可以是任何類型.比如List.xml需要指定parameterType
//mapper.java
List<BizProcessDataEntity> findDistinctNameList(Map map);
//mapper.xml 此時需要指定參數類型爲map.(parameterType="java.util.Map")
#{map裏的key}
----------------------------------------------如有疑問,歡迎留言.------------------------------------------------