Mybatis两种不同批量插入方式的区别

编辑: admin 分类: java 发布时间: 2021-12-03 来源:互联网
目录
  • 前言
  • 测试
    • 拼接 sql
    • batch插入
  • 数据对比
    • 总结

      前言

      本文使用 Mybatis 进行批量插入,比较两种不同的插入方式的区别。

      测试

      批量插入注意事项:

      1、连接数据库时添加参数 allowMultiQueries=true,支持多语句执行,批处理

      2、数据库是否支持大量数据写入,设置 max_allowed_packet参数保证批次提交的数据量

      拼接 sql

      public void batchDemo() {
              long start = System.currentTimeMillis();
              List<User> list = new ArrayList<>();
              for (int i = 0; i < 5000; i++) {
                  User user = new User();
                  user.setId(UUID.randomUUID().toString());
                  user.setName("feiyangyang");
                  user.setPwd("feiyangyang");
                  list.add(user);
              }
              userService.batchForeach(list);
              long end = System.currentTimeMillis();
              System.out.println("---------------" + (start - end) + "---------------");
          }
      
      <insert id="batchForeach" parameterType="com.fyy.druid.entity.User">
          insert into
          user(id,`name`,pwd)
          values
          <foreach collection ="userList" item="user" separator =",">
              (#{user.id}, #{user.name}, #{user.pwd})
          </foreach>
      </insert>
      

      batch插入

      public void batchInsert() {
          long start = System.currentTimeMillis();
          SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH);
          UserService mapper = sqlSession.getMapper(UserService.class);
      
          for (int i = 0; i < 5000; i++) {
              User user = new User();
              user.setId(UUID.randomUUID().toString());
              user.setName("feiyangyang");
              user.setPwd("feiyangyang");
              mapper.batchInsert(user);
          }
          sqlSession.commit();
          long end = System.currentTimeMillis();
          System.out.println("---------------" + (start - end) + " ---------------");
      }
      

      注意:batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的

      数据对比

      拼接sql (ms) batch插入 (ms) 500条 1744 639 2000条 26966 2473 5000条 173668 7382

      总结

      到此这篇关于Mybatis两种不同批量插入方式区别的文章就介绍到这了,更多相关Mybatis批量插入方式内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

      【本文由:http://www.nextecloud.cn/flb.html提供,感谢】