Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 485|回复: 0

解决使用mybatis做批量操作时发生的异常:Parameter '__frch_item_0' not found. Available parameters are [list] 记录

[复制链接]
  • TA的每日心情
    奋斗
    3 天前
  • 签到天数: 757 天

    [LV.10]以坛为家III

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    707886
    发表于 2021-7-20 11:48:52 | 显示全部楼层 |阅读模式

    本文主要描述 使用mybatis进行批量更新、批量插入 过程中遇到的异常及总结:

    首先贴出使用批量操作报的异常信息:

    1 java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are 
      2 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are
        3 at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) 4 at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)

     

    最终查到导致异常的原因是 foreach中的属性字段名字写错了!表字段太多,一个个找的还是很费劲的!建议这种做好单元测试!

    另外,写xml的时差错,还可以从下面几点检查。

    1、parameterType="Java.util.List",这个parameterType有没有写错;

    2、<foreach collection="list" item="item" index="index" open="" close="" separator=";">这行中,collection是不是List

    关于批量更新做一个总结:

    批量更新有两种,一种是通过id更新很多字段,第二种是更改一列,值是固定的这种。下面分别贴出列子

    例子:

    更新一列:

    1 <update id="batchUpdateResult" parameterType="java.util.List">    
    2          update
    3          <include refid="input_invoice_original_record" />
    4        set isGet = 0 where invoiceNum in
    5        <foreach collection="list" item="item" open="(" separator="," close=")">
    6        #{item}
    7        </foreach>
    8 </update>

    这种直接是item就行,只是一个查询的条件范围。

    更新很多字段:

     1 <update id="batchUpdate" parameterType="list">
     2             <foreach collection="list" item="item" index="index" open="" close="" separator=";">
     3                   update
     4                   <include refid="input_invoice_original_record" />
     5                   <trim prefix="SET" suffixOverrides=",">
     6                         <if test="item.title != null">
     7                               title = #{item.title},
     8                         </if>
     9                         <if test="item.invoiceNum != null">
    10                               invoiceNum = #{item.invoiceNum},
    11                         </if>
    12                         <if test="item.invoiceCode != null">
    13                               invoiceCode = #{item.invoiceCode},
    14                         </if>
    15                         <if test="item.invoiceDate != null">
    16                               invoiceDate = #{item.invoiceDate},
    17                         </if>
    18     
    19                         </trim>
    20                   WHERE id = #{item.id}
    21             </foreach>
    22       </update>
    23     

    注意,这种传的是一个个的对象在list集合中,要加item.属性名称,空判断的时候别忘记这种格式,这里我犯过错,没少费时间。

    贴出来当时忘记加item的异常 信息:

    1 java.lang.RuntimeException: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'title' not found. Available parameters are 
      2 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'title' not found. Available parameters are
        3 at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) 4 at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:365)

    找这个问题用了不少时间!

     

    下面说一下批量插入操作。

     1       <insert id="batchInsert" parameterType="java.util.List"
     2             useGeneratedKeys="true" keyProperty="id">
     3             <selectKey resultType="long" keyProperty="id" order="AFTER">
     4                   SELECT
     5                   LAST_INSERT_ID()
     6             </selectKey>
     7             INSERT INTO
     8             <include refid="input_invoice_original_record" />
     9             (
    10             title ,
    11             invoiceNum,
    12             invoiceCode,
    13             invoiceDate,
    14             sellDate ,
    15             invoiceCategory
    16             )
    17             VALUES
    18             <foreach collection="list" item="item" index="index"
    19                   separator=",">
    20                   (
    21                   #{item.title} ,
    22                   #{item.invoiceNum},
    23                   #{item.invoiceCode},
    24                   #{item.invoiceDate},
    25                   #{item.sellDate} ,
    26                   #{item.invoiceCategory}
    27                   )
    28             </foreach>
    29       </insert>

    易错点和批量更新一样,写的时候要仔细。

     

    这里做一个总结,如果不正确之处,欢迎指正!

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-7-5 03:04 , Processed in 0.054883 second(s), 28 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表