【Java报错】mapper传入array\collection\list类型的参数时报BindingException:Parameter `` not found(问题复现+3种解决方法)
1. 問題說明
這里只貼出核心代碼:
// 查詢數據 List<StatisticalInfo> statisticalInfoList = null; // 保存數據 boolean isSuccess = baseComponent.batchInsert(statisticalInfoList);這里是批量保存數據時使用的SQL:
<insert id="batchInsert" parameterType="com.xxx.StatisticalInfo">insert into statistical_info (id, table_name, group_time, total_rows)values<foreach collection="statisticalInfoList" index="index" item="item" separator=",">( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )</foreach> </insert>報錯信息如下:
nested exception is org.apache.ibatis.binding.BindingException: Parameter 'statisticalInfoList' not found. Available parameters are [collection, list]2. 解決
【方法 1??】只將【collection=“statisticalInfoList”】修改為【collection=“list”】即可(不用修改其他任何文件):
<insert id="batchInsert" parameterType="com.xxx.StatisticalInfo">insert into statistical_info (id, table_name, group_time, total_rows)values<foreach collection="list" index="index" item="item" separator=",">( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )</foreach> </insert>【方法 2??】只在Mapper接口給參數添加 @Param(“statisticalInfoList”) 注解(不用修改mapper文件):
public interface BaseMapper {/*** 批量導入統計結果數據** @param statisticalInfoList 查詢的統計結果* @return 導入成功標志*/boolean batchInsert(@Param("statisticalInfoList") List<StatisticalInfo> statisticalInfoList); }mapper文件里的SQL依然是【collection=“statisticalInfoList”】:
<insert id="batchInsert" parameterType="com.xxx.StatisticalInfo">insert into statistical_info (id, table_name, group_time, total_rows)values<foreach collection="statisticalInfoList" index="index" item="item" separator=",">( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )</foreach> </insert>【方法 3??】不修改接口,將參數封裝成map對象(適用于多個參數情況)這里添加了一個 schemaName 參數:
// 將參數封裝 HashMap<String, Object> parameter = new HashMap<>(2); parameter.put("insertList", statisticalInfoList); parameter.put("schemaName", schemaName);mapper文件里的SQL參數類型修改【parameterType=“map”】collection值修改成map對應的key值【collection=“insertList”】:
<insert id="batchInsertStatisticalInfo" parameterType="map">insert into ${schemaName}stat_data_source (id, table_name, group_time, total_rows)values<foreach collection="insertList" index="index" item="item" separator=",">( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )</foreach> </insert>? 注意: 如果你傳入的參數是List對象,而collection寫的卻是array【collection=“array”】
<insert id="batchInsert" parameterType="com.xxx.StatisticalInfo">insert into statistical_info (id, table_name, group_time, total_rows)values<foreach collection="array" index="index" item="item" separator=",">( #{item.id}, #{item.tableName}, #{item.groupTime}, #{item.totalRows} )</foreach> </insert>將會報如下錯誤:
nested exception is org.apache.ibatis.binding.BindingException: Parameter 'array' not found. Available parameters are [collection, list]使用時要特別注意 😂
總結
在mapper接口文件里使用@Param("")注解一下參數是很好的習慣,在編碼過程中IDE會驗證 mapper 文件里的接收到的參數,更不容易出錯 💯
總結
以上是生活随笔為你收集整理的【Java报错】mapper传入array\collection\list类型的参数时报BindingException:Parameter `` not found(问题复现+3种解决方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java报错】多数据源mapper异常
- 下一篇: 【Java报错】Greenplum数据库