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 生成图片验证码3种方法(字母、加减乘除、中文)

    Java 生成图片验证码3种方法(字母、加减乘除、中文)

    这篇文章主要介绍了Java 生成图片验证码3种方法(字母、加减乘除、中文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • mybatis中关于type-aliases-package的使用

    mybatis中关于type-aliases-package的使用

    这篇文章主要介绍了mybatis中关于type-aliases-package的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • springboot集成nacos无法动态获取nacos配置的问题

    springboot集成nacos无法动态获取nacos配置的问题

    这篇文章主要介绍了springboot集成nacos无法动态获取nacos配置的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot静态资源目录访问

    SpringBoot静态资源目录访问

    今天小编就为大家分享一篇关于SpringBoot静态资源目录访问,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • SpringBoot发送异步邮件流程与实现详解

    SpringBoot发送异步邮件流程与实现详解

    这篇文章主要介绍了SpringBoot发送异步邮件流程与实现详解,Servlet阶段邮件发送非常的复杂,如果现代化的Java开发是那个样子该有多糟糕,现在SpringBoot中集成好了邮件发送的东西,而且操作十分简单容易上手,需要的朋友可以参考下
    2024-01-01
  • java通过证书访问etcd的实现步骤

    java通过证书访问etcd的实现步骤

    Etcd提供了多种语言的客户端库,本文主要介绍了java通过证书访问etcd的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • mybatis中使用not in与 in的写法说明

    mybatis中使用not in与 in的写法说明

    这篇文章主要介绍了mybatis中使用not in与 in的写法说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java压缩文件操作详解

    Java压缩文件操作详解

    这篇文章主要为大家详细介绍了如何利用Java语言进行压缩文件操作,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-08-08
  • 使用spring security BCryptPasswordEncoder接入系统

    使用spring security BCryptPasswordEncoder接入系统

    这篇文章主要介绍了使用spring security BCryptPasswordEncoder接入系统方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • java String.join()的使用小结

    java String.join()的使用小结

    String.join()是Java 8引入的一个实用方法,用于将多个字符串按照指定分隔符连接成一个字符串,本文主要介绍了java String.join()的使用小结,感兴趣的可以了解一下
    2025-03-03

最新评论