今天做项目本来顺风顺水,居然让一个BUG绊了一跤
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'code' not found. Available parameters are [list]此异常,为:ibatis 无效绑定异常
简单的报错信息,Parameter ‘code’ not found. Available parameters are [list]
多方查看,总结了比较全面的问题可能性和解决办法
可能性一:
如果你的插入语句这样写就有问题了,foreach循环中,item代表你当前循环list集合中的一
个对象,那么你要插入属性的话,就应该是#{item.code}这样的,直接写#{code}肯定是找不
到
<insert id="saveA" parameterType="com.test.model.A"> INSERT INTO insurance_type_info( code, a_name, a_type, a_describle, a_id ) VALUES <foreach collection="list" index= "index" item="item" open="" separator ="," close=""> ( #{code}, #{aName}, #{aType}, #{aDescrible}, #{aId} ) </foreach> </insert>可能性二:
那这种情况就比较尴尬了,就是你的实体类中没有定义这个code,当然也就找不到了,
这个时候不用我说你也知道该怎么做了吧(当然是直接在实体类中加上code了)
可能性三:
查看一下foreach里面的名称字段是否写错 ,相信来百度的各位应该在这方面都是看了又
看的,这个犯错的可能性不大
可能性四:
查看parameterType的类型是不是java.util.List类型,如果是的话,看foreach 的collection属性
是不是list,
因为 传递一个 List 实例或者数组作为参数对象传给 MyBatis,MyBatis 会自动将它包装在一个
Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键
之所以collection的属性必须设置为list,也是有说法的,你可以看一下下边这段代码,就知道
了
private Object wrapCollection(Object object) { DefaultSqlSession.StrictMap map; // 如果传入参数是一个集合 if (object instanceof Collection) { //创建1个Map map = new DefaultSqlSession.StrictMap(); map.put("collection", object); //注意 如果参数是list if (object instanceof List) { //那么传来的参数,collection的默认写法应该 collection="list" map.put("list", object); } return map; } else if (object != null && object.getClass().isArray()) { map = new DefaultSqlSession.StrictMap(); //数组的默认写法为collection="array" map.put("array", object); return map; } else { return object; } }当然,万事不是绝对,如果实在不想用list的话,咱们也是有办法的,我们可以改动mapper接
口中定义的方法了如下:
List<Student> selectKeyList(@Param("studentList")List<String> studentList);然后我们的sql就可以写成 collection=“studentList” ,看下面
<foreach collection="studentList" index= "index" item="item" open="" separator ="," close=""> ( #{item.code}, #{item.aName}, #{item.aType}, #{item.aDescrible}, #{item.aId} ) </foreach>但是这样写就要注意咯!
1.Dao.java中 方法传入参数字段前添加@Param(“xxx”)
2.注意!!!
@Param的包别导错了
—import org.apache.ibatis.annotations.Param;
千万别导入spring的。。
最后,下面是我用的正确的批量插入的sql,注意上下字段属性名要写对,然后都标出来啦,细
心一点就没问题了! 这里也推一些文章,可以借鉴一下,里面东西的可是我这里没总结的!
org.apache.ibatis.binding.BindingException【原因汇总】马太胖原创