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


    本文主要描述 使用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 [list]
    2 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found. Available parameters are [list]
    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 [list]
    2 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'title' not found. Available parameters are [list]
    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>

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

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

  • 相关阅读:
    Docker安装
    MVC-HtmlHelper简单总结
    D3.js
    分布式事务seata
    彻底搞懂JAVA路径问题
    idea 代码生成
    自动生成 serialVersionUID 的设置
    狂神说SSM框架系列连载
    缓存穿透、缓存击穿、缓存雪崩区别和解决方案
    多线程
  • 原文地址:https://www.cnblogs.com/yangh965/p/6544949.html
Copyright © 2020-2023  润新知