JAVA MyBatis批量操作(插入)时异常

传入为 List<Object> 确定为不为空

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter '__frch_item_0' not found.

<insert id="batchInsert">
    insert into
    personal_tag(type, tag, create_time, open_account_id)
    values
    <foreach collection="list" item="item" separator=",">
        (#{item.type,jdbcType=INTEGER},
        #{item.tag,jdbcType=VARCHAR},
        #{item.createTme,jdbcType=TIMESTAMP},
        #{item.openAccountId,jdbcType=BIGINT})
    </foreach>ON DUPLICATE KEY UPDATE tag=tag
</insert>

代码如上....

确定传入值不为空


忘记补充,我的项目里其他地方也有批量插入的代码 , 类似于这个 全部都是正确执行的

mybatis ver : 3.3.0

阅读 9.1k
7 个回答

此问 关闭 题主没有找到任何答案 靠升级mybatis版本后解决此问题

在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

<insert id="batchInsert">
    insert into
    personal_tag(type, tag, create_time, open_account_id)
    values
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.type,jdbcType=INTEGER},
        #{item.tag,jdbcType=VARCHAR},
        #{item.createTme,jdbcType=TIMESTAMP},
        #{item.openAccountId,jdbcType=BIGINT})
    </foreach>ON DUPLICATE KEY UPDATE tag=tag
新手上路,请多包涵

ON DUPLICATE KEY UPDATE tag=tag
把这一句改为
ON DUPLICATE KEY UPDATE tag=#{item.tag}

新手上路,请多包涵

BindingException,那么一定是Mybatis遍历你Collections的时候,有个对象取不到item属性,也许你放了一个null对象,请检查你的List<Object>

<insert id="batchInsert" parameterType="java.util.List">
    insert into
    personal_tag(type, tag, create_time, open_account_id)
    values
    <foreach collection="list" item="item" separator=",">
        (#{item.type,jdbcType=INTEGER},
        #{item.tag,jdbcType=VARCHAR},
        #{item.createTme,jdbcType=TIMESTAMP},
        #{item.openAccountId,jdbcType=BIGINT})
    </foreach>ON DUPLICATE KEY UPDATE tag=tag
</insert>

在insert标签加参数类型呢


修改下参数别名呢,还有接口的参数名,下面是我们之前的项目里的
void addRiskItemBatch(@Param("lstItem")List<FastRiskItemInfo> lstItem);

<!-- 批量添加条款 -->
<insert id="addRiskItemBatch" useGeneratedKeys="true" parameterType="java.util.List">  
    <selectKey resultType="long" keyProperty="id" order="AFTER">  
        SELECT  
        LAST_INSERT_ID()  
    </selectKey>
    insert into fast_risk_item_info (query_id, risk_item_id, 
      item_no, item_name, item_price, 
      status, create_time)
    values  
    <foreach collection="lstItem" item="item" index="index" separator="," >  
        (#{item.queryId,jdbcType=INTEGER}, #{item.riskItemId,jdbcType=INTEGER}, 
      #{item.itemNo,jdbcType=VARCHAR}, #{item.itemName,jdbcType=VARCHAR}, #                       {item.itemPrice,jdbcType=DECIMAL}, 
      #{item.status,jdbcType=INTEGER}, #{item.createTime,jdbcType=VARCHAR})
    </foreach>  
   </insert>
新手上路,请多包涵

image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题