背景
mybatis在执行批量插入(方式二)和批量更新操作时,如果连接参数allowmultiqueries=false(默认),会批量操作失败,而且sql语句copy出来运行正常
报错如下图:

如何解决此类问题
在设置数据库连接时,添加allowmultiqueries=true
spring:
datasource:
url: jdbc:mysql://localhost:3306/db-test?allowmultiqueries=trueallowmultiqueries 参数
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>总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论