文档章节

MyBatis批量操作报错:Parameter 'xxxList' not found. Avail

Oscarfff
 Oscarfff
发布于 2015/08/24 23:03
字数 676
阅读 375
收藏 5

需求: 根据传入的参数批量 删除数据:

DAO:

  1. List ll = new ArrayList<Integer>();  
    for(int i=10;i<25;i++){  
           ll.add(i);  
    }       
    int res = userMapper.delUser(li);  
    System.out.println(res);


xml:

  1. <delete id="delUser" parameterType="list" >  
    delete  from users where id in   
    <foreach collection="li" index="index" open="(" close=")" separator="," item="itm">  
        #{itm}  
    </foreach>  
    </delete>


这样处理会报错

  1. com.chenzhou.base.mybatis.IbatisSystemException: SqlSession operation; nested exception is org.apache.ibatis.exceptions.PersistenceException:   
    ### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'li' not found. Available parameters are [list]  
    ### Cause: org.apache.ibatis.binding.BindingException: Parameter 'studentNameList' not found. Available parameters are [list]  
        at com.chenzhou.base.mybatis.SqlSessionTemplate.wrapException(SqlSessionTemplate.java:341)  
        at com.chenzhou.base.mybatis.SqlSessionTemplate.execute(SqlSessionTemplate.java:127)  
        at com.chenzhou.base.mybatis.SqlSessionTemplate.execute(SqlSessionTemplate.java:106)  
        at com.chenzhou.base.mybatis.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:138)  
        at com.chenzhou.dao.GenericMybatisDao.count(GenericMybatisDao.java:306)  
        at com.chenzhou.cds.ps.dao.impl.StudentDao.getStudentCount(StudentDao.java:42)  
        at com.chenzhou.cds.ps.dao.impl.StudentDao
    FastClassByCGLIB
    8819e766.invoke(<generated>)  
        at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)  
        at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)  
        at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80)  
        at com.chenzhou.util.LogUtil.doMethodInfo(LogUtil.java:85)  
        at com.chenzhou.util.LogUtil.doDebugMethodLog(LogUtil.java:36)  
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
        at java.lang.reflect.Method.invoke(Method.java:597)  
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)  
        at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610)  
        at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:65)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:55)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)  
        at com.chenzhou.cds.ps.dao.impl.StudentDao
    EnhancerByCGLIB
    d4fcf513.getStudentCount(<generated>)  
        at com.chenzhou.ps.dao.StudentDaoTest.testgetStudentCount(StudentDaoTest.java:44)  
    ……


根据报错日志分析,是MyBatis在解析xml时找不到其中声明的li,但是在Dao中明明传的参数就是li,怎么会报错呢?

查询了一下MyBatis官方的说明文档,终于找到了原因,在http://mybatis.github.io/mybatis-3/zh/dynamic-sql.html#foreach里有一段说明:

写道

注意 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时 候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。

因为我传的参数只有一个,而且传入的是一个List集合,所以mybatis会自动封装成Map<"list",li>。在解析的时候会通过“list”作为Map的key值去寻找。但是我在xml中却声明成li了,所以自然会报错找不到。

更改:

<delete id="delUser" parameterType="map" >  
delete  from users where id in   
<foreach collection="li" index="index" open="(" close=")" separator="," item="itm">  
    #{itm}  
</foreach>  
</delete>

  1.  List ll = new ArrayList<Integer>();  
        for(int i=10;i<25;i++){  
        ll.add(i);  
      }  
      HashMap li =new HashMap();  
          li.put("li", ll);  
         int res = userMapper.delUser(li);  
         System.out.println(res);


修改dao中的参数传入方式,手动封装成map,然后把map当参数传进去,这样mybatis会跟据参数map的key去匹配value,由于dao的key和xml中的key一样可以匹配上,所以OK,如果

  1. HashMap li =new HashMap();  
    li.put("li", ll);

和xml中

  1. <foreach collection=
    "li"........

不一样仍然会报错。

另一种修改的方式是直接修改成

  1. <foreach collection="list"  
    xml中的接受的参数仍然是list即可。


本文转载自:http://blog.csdn.net/liyantianmin/article/details/44907249

共有 人打赏支持
Oscarfff
粉丝 74
博文 815
码字总数 96913
作品 0
崇明
后端工程师
私信 提问
MyBatis 是不是不支持 批量插入 id自增长的数据?

MyBatis 是不是不支持 批量插入 id自增长的数据? 就是批量插入的时候,insert 属性useGeneratedKeys="true" keyProperty="id",如果insert into article (param1,param2,param3) values (X,......

Flyer_cao
2014/05/17
2.8K
2
MyBatis MapperProvider MessageFormat拼接批量SQL语句执行报错

最近在项目中有这么一段代码:下载服务器基础业务数据进行本地批量插入操作,因项目中使用mybatis进行持久化操作,故直接考虑使用mybatis的批量插入功能。 1.以下是Mapper接口的部分代码 pu...

神是到着念
2016/01/18
58
0
Mybatis3.3.x技术内幕(十五):Mybatis之foreach批量insert,返回主键id列表(修复Mybatis返回null的bug)

Mybatis在执行批量插入时,如果使用的是for循环逐一插入,那么可以正确返回主键id。如果使用动态sql的foreach循环,那么返回的主键id列表,可能为null,这让很多人感到困惑;本文将分析问题产...

祖大俊
2016/05/13
9.6K
17
Mybatis[批量]插入返回自增ID

简介 最近在业务功能中需要获取mybatis插入的数据并且返回插入数据的ID,去执行其他的操作,说来也很简单,在正常的insert标签里面加入提供的其他属性即可实现,故现在抽时间整理出来,希望能...

阿郎_
2017/05/23
0
0
SPring整合Mybatis配置--Mysql批量更新坑

mybatis 批量更新sql写完运行报错,但是一看sql是正确的; 那么就得考虑下是不是配置上不支持批量更新操作了,mybatis 调用mysql完成批量更新是需要我们去手动设置,打开这个开关的。 true是...

胖猫警长
2018/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring学习记录

Java类定义配置 @Configuration //标记为配置类@ComponentScan //标记为扫描当前包及子包所有标记为@Component的类@ComponentScan(basePackageClasses = {接口.class,...}) //标记为扫描当...

CHONGCHEN
58分钟前
1
0
如何开发一款以太坊(安卓)钱包系列2 - 导入账号及账号管理

这是如何开发一款以太坊(安卓)钱包系列第2篇,如何导入账号。有时用户可能已经有一个账号,这篇文章接来介绍下,如何实现导入用户已经存在的账号。 导入账号预备知识 从用户需求上来讲,导...

Tiny熊
今天
3
0
intellJ IDEA搭建java+selenium自动化环境(maven,selenium,testng)

1.安装jdk1.8; 2.安装intellJ; 3.安装maven; 3.1 如果是单前用户,配置用户环境变量即可,如果是多用户,则需配置系统环境变量,变量名为MAVEN_HOME,赋值D:\Application\maven,往path中...

不最醉不龟归
今天
4
0
聊聊ShenandoahGC的Brooks Pointers

序 本文主要研究一下ShenandoahGC的Brooks Pointers Shenandoah Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有 Snapshot-at-the-beginning concurrent mark包括Init Mark(P......

go4it
昨天
4
0
Makefile通用编写规则

#简单实用的Makefile模板: objs := a.o b.o test:$(objs) gcc -o test $^ # .a.o.d .b.o.d dep_files := $(foreach f,$(objs),.$(f).d) dep_files := $(wildcard $(dep_files)) ifneq ($(d......

shzwork
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部