Mybatis批量插入和批量更新失败问题

 更新时间:2024年08月19日 10:13:03   作者:一棵星  
这篇文章主要介绍了Mybatis批量插入和批量更新失败问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

Mybatis在执行批量插入(方式二)和批量更新操作时,如果连接参数allowMultiQueries=false(默认),会批量操作失败,而且sql语句copy出来运行正常

报错如下图:

如何解决此类问题

在设置数据库连接时,添加allowMultiQueries=true

spring:
    datasource:
        url: jdbc:mysql://localhost:3306/db-test?allowMultiQueries=true

allowMultiQueries 参数

allowMultiQueries 是 MySQL 数据库连接参数之一,用于指示是否允许在单个查询中执行多个 SQL 语句。

如果设置为 true,则允许执行多个 SQL 语句,以分号 ; 分隔。

这在某些情况下可能会导致安全风险,因为它可能会受到 SQL 注入攻击的影响。

因此,默认情况下,allowMultiQueries 通常被设置为 false,以提高安全性。

Mybatis批量插入

方式一,单条SQL插入,allowMultiQueries=false,不会报错

void batchInsert(@Param("list") List<UserInfo> list);
<insert id="batchInsert">
     insert into t_user_info
     <trim prefix="(" suffix=")" suffixOverrides=",">
         <if test="list[0].username != null">
             username,
         </if>
         <if test="list[0].pwd != null">
             pwd,
         </if>
         <if test="list[0].createTime != null">
             create_time,
         </if>
     </trim>
     values
     <foreach collection="list" item="item" index="index" separator=",">
         <trim prefix="(" suffix=")" suffixOverrides=",">
             <if test="item.username != null">
                 #{item.username},
             </if>
             <if test="item.pwd != null">
                 #{item.pwd},
             </if>
             <if test="item.createTime != null">
                 #{item.createTime},
             </if>
         </trim>
     </foreach>
 </insert>

方式二,多条SQL插入,allowMultiQueries=false,会报错

void batchInsert(@Param("list") List<UserInfo> list);
<insert id="batchInsert">
    <foreach collection="list" item="item" index="index" separator=";">
        insert into t_user_info
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="item.username != null">
                username,
            </if>
            <if test="item.pwd != null">
                pwd,
            </if>
            <if test="item.createTime != null">
                create_time,
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="item.username != null">
                #{item.username},
            </if>
            <if test="item.pwd != null">
                #{item.pwd},
            </if>       
            <if test="item.createTime != null">
                #{item.createTime},
            </if>
        </trim>
    </foreach>
</insert>

Mybatis批量更新,allowMultiQueries=false,会报错

void batchUpdate(@Param("list") List<UserInfo> list);
<update id="batchUpdate">
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update t_user_info
        <set>
            <if test="item.username != null">
                username = #{item.username},
            </if>
            <if test="item.pwd != null">
                pwd = #{item.pwd},
            </if>
            <if test="item.updateTime != null">
                update_time = #{item.updateTime},
            </if>
        </set>
        where id = #{item.id}
    </foreach>
</update>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现Timer的定时调度函数schedule的四种用法

    Java实现Timer的定时调度函数schedule的四种用法

    本文主要介绍了Java实现Timer的定时调度函数schedule的四种用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Springboot整合Active消息队列

    Springboot整合Active消息队列

    这篇文章主要介绍了Springboot整合Active消息队列的步骤,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-12-12
  • 基于Java Socket实现一个简易在线聊天功能(一)

    基于Java Socket实现一个简易在线聊天功能(一)

    这篇文章主要给大家介绍基于Java Socket实现一个简易在线聊天功能(一),分为客户端和服务端两段代码,非常具有参考价值,感兴趣的朋友一起学习吧
    2016-05-05
  • 基于Java中UDP的广播形式(实例讲解)

    基于Java中UDP的广播形式(实例讲解)

    下面小编就为大家分享一篇基于Java中UDP的广播形式(实例讲解),具有很好的参考价值,希望对大家有所帮助
    2017-12-12
  • Java注解的简单入门小案例

    Java注解的简单入门小案例

    这篇文章主要介绍了Java注解的简单入门小案例,注解是干什么的?怎么使用?注解的简单用法,需要的朋友可以参考下
    2023-04-04
  • 举例讲解Java设计模式编程中模板方法模式的运用实例

    举例讲解Java设计模式编程中模板方法模式的运用实例

    这篇文章主要介绍了Java设计模式编程中模板方法模式的运用实例,模板方法模式强调基于继承的代码复用,需要的朋友可以参考下
    2016-05-05
  • Springboot 自定义校验代码实例

    Springboot 自定义校验代码实例

    这篇文章主要介绍了Springboot 自定义校验代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • Java日期时间以及日期相互转换

    Java日期时间以及日期相互转换

    这篇文章主要为大家详细介绍了Java日期时间,以及日期相互转换的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • JAVA模拟新增顺序表及单链表

    JAVA模拟新增顺序表及单链表

    这篇文章主要介绍了JAVA模拟新增顺序表及单链表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java读取txt文件和写入txt文件的简单实例

    Java读取txt文件和写入txt文件的简单实例

    下面小编就为大家带来一篇Java读取txt文件和写入txt文件的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11

最新评论