开发者

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

目录
  • 背景
  • 如何解决此类问题
  • allowMultiQueries 参数
  • MyBATis批量插入
    • 方式一,单条SQL插入,allowMultiQueries=false,不会报错
    • 方式二,多条SQL插入,allowMultiQueries=false,会报错
  • Mybatis批量更新,allowMultiQueries=false,会报错
    • 总结

      背景

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

      报错如下图:

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

      如何解决此类问题

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

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

      allowMultiQueries 参数

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

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

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

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

      Mybatis批量插入

      方式一,单条SQLhttp://www.devze.com插入,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},
         www.devze.com          </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">
                      user编程name,
                  </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">python
          <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>

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜