批量更新遇到的坑

Mybatis批量更新遇到的坑

一、问题概述

在开发的时候我的需求里面有一个将信息填写到 Excel 表格中然后导入表格,后台进行校验,库中没有的就插入库中已有的就更新,在我批量更新的时候遇到了一个问题导致我的批量更新一直失败。错误的 xml 动态 SQL 我这边没有备份我就直接放一个最终的 SQL 吧

<!--  高中班级学生信息批量导入  -->
<insert id="insertBatch" parameterType="java.util.List">
    <foreach collection="users" item="item" open="" close="" separator=";">
        INSERT INTO high_class_student
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="item.id != null">id,</if>
            <if test="item.idType != null">id_type,</if>
            <if test="item.studentId != null">student_id,</if>
            <if test="item.status != null">status,</if>
            <if test="item.schoolName != null and item.schoolName != ''">school_name,</if>
            <if test="item.className != null and item.className != ''">class_name,</if>
            <if test="item.studentName != null and item.studentName != ''">student_name</if>
        </trim>
        <trim prefix="VALUES ( " suffix=")" suffixOverrides=",">
            <if test="item.id != null">#{item.id},</if>
            <if test="item.idType != null">#{item.idType},</if>
            <if test="item.studentId != null">#{item.studentId},</if>
            <if test="item.status != null">#{item.status},</if>
            <if test="item.schoolName != null and item.schoolName != ''">#{item.schoolName},</if>
            <if test="item.className != null and item.className != ''">#{item.className},</if>
            <if test="item.studentName != null and item.studentName != ''">#{item.studentName}</if>
        </trim>
    </foreach>
</insert>

二、分析

这里我讲一下如果仅仅这样写那么执行的时候会报错,具体原因下面将,先说一下控制输出的 sql 因为第一时间没有记录我的错误所以我只能分析和回忆一下,因为我是用的 foreach 标签后面的 separator(分隔符) 又是 “;” 分号 所以这里每一个 insert into() values() 后面都会有一个分号,大概是下面这样子的。

insert into high_class_student(*,*,*,*,*) values(?,?,?,?,?);
insert into high_class_student(*,*,*,*,*) values(?,?,?,?,?);
insert into high_class_student(*,*,*,*,*) values(?,?,?,?,?);
insert into high_class_student(*,*,*,*,*) values(?,?,?,?,?);
insert into high_class_student(*,*,*,*,*) values(?,?,?,?,?);

这些复制到数据库管理工具 navicat 中执行的时候是没有问题的,但是在代码中执行会报错,具体的报错原因我也忘记了,大概就是什么 EOF(具体记不清了) 什么之类的,后面搜了一下就是不支持批量执行SQL(下面第一个链接就是我当时网上查找问题的时候借鉴的文章),

三、解决方案

上面批量执行是没有问题的但是一定要在配置中加上允许批量执行的代码

url: jdbc:mysql://localhost/sss?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
username: root
password: root

就是在数据源配置 url 后面加上 allowMultiQueries=true 开启允许批量执行 SQL即可。然后就不会报错了。

四、其他小问题

由于我是 ikun 所以我比较菜,所以我遇到的问题比较多,这上面的 sql 里面我的更新字段是动态的 ,比如:

<if test="item.id != null">id,</if>
<if test="item.idType != null">id_type,</if>
<if test="item.studentId != null">student_id,</if>
<if test="item.status != null">status,</if>
<if test="item.schoolName != null and item.schoolName != ''">school_name,</if>
<if test="item.className != null and item.className != ''">class_name,</if>
<if test="item.studentName != null and item.studentName != ''">student_name</if>

就是我传过来什么参数他更新哪些字段,但是我有的时候恰巧更新到倒数第二个字段

<if test="item.id != null">id,</if>
<if test="item.idType != null">id_type,</if>
<if test="item.studentId != null">student_id,</if>
<if test="item.status != null">status,</if>
<if test="item.schoolName != null and item.schoolName != ''">school_name,</if>
<if test="item.className != null and item.className != ''">class_name,</if>

那么这个时候细心点就会发现 class_name, 字段后面会多了一个逗号,那么这在执行的时候也会报错,后面我加上了 trim 标签

<trim prefix="(" suffix=")" suffixOverrides=",">

直接移除了最末尾的逗号,所以就不会报错了。这都是不细心的时候会出现的问题,当然,也许是因为天天熬夜头脑变的真的迟钝了。这里我也只是想记录一下自己遇到的错误,以后再遇到的话可以及时来看这个文章纠正,如果这个文章有什么不对之处还请大家帮忙指出,谢谢。对了,还要感谢下面我借鉴的文章的那些作者们,感谢他们能将解决问题的方法分享在网上。谢谢。

记录时间:2023年6月28日23:31:02

记录人:HaHaCoder

五、一些相关的文章

Mybatis之批量更新数据(批量update) <- 借鉴此文章

MyBatis-批量update

allowMultiQueries=true的作用

allowMultiQueries 设置为true不生效问题

MySQL中jdbc驱动开启批量执行sql参数allowMultiQueries

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值