Mybatis批量插入或更新的几种姿势对比

Mybatis批量插入或更新的几种姿势对比,第1张

Mybatis批量插入或更新的几种姿势对比 mybatis批量插入数据到数据库中 好久没写文章了,有几个月了,今天给说一个批量插入的的案例 1.先说一下实际的业务场景吧
  1. 有一张excel表格。里面有6万条数据。客户给的库存表格。可能实际数量比这个大一点,但是出入可能不会太大。
  2. 现在要做的就是快速的插入到表里面。争取控制到一分钟内响应到前端。
2.说一下百度到和自己想到的几个解决思路和办法
  1. 就是一条一条的插入
  2. 网上百度到的,说是通过写mysql存储过程来存。说是这个办法快点。但是我没有试,因为我不怎么会写存储过程。看文章的大体思路是说,先把数据写到一个文件中。再用mysql去读取这个文件,然后再插入。感觉网上这么做的人挺多的,但是这个办法,执行起来对我来说难度较大。
  3. 分批插入,就是把这几万条数据拆分为小的集合,然后在用insert into values 这个一次性插入多条的进行插入。这里面可以加入线程。可以提高速度。(但是我没有加线程,目前分批插入对我来说已经够用了)
3.1 废话不不多说给大家看一下一条一条插入所耗费的时间(框架是mybatis-plus)
 System.out.println(new Date());
       if(list.size()>0){
           List> ck = ck(collect, 400);
           System.out.println("list集合大小-"+collect.size());
           for (int m = 0; m < ck.size(); m++) {
               for (int tt = 0; tt < ck.get(m).size(); tt++) {
                   ck.get(m).get(tt).setId(uuid());
                   //一个一个插入
                   tjInventoryMapper.insert(ck.get(m).get(tt));
               }
//               tjinventoryService.saveBatch(ck.get(m));
           }
       }
        System.out.println(new Date());

耗时65秒 3.2 看一下采用分批插入的所耗费的时间(这里用的是plus里面的plus里面saveBatch这个方法,没用过的请自行百度)
 System.out.println(new Date());
       if(list.size()>0){
       //这里是把这6万条数据拆分成每个400条数据的集合
           List> ck = ck(collect, 400);
           System.out.println("list集合大小-"+collect.size());
           for (int m = 0; m < ck.size(); m++) {
               for (int tt = 0; tt < ck.get(m).size(); tt++) {
                   ck.get(m).get(tt).setId(uuid());
                   //一个一个插入
//                   tjInventoryMapper.insert(ck.get(m).get(tt));
               }
               tjinventoryService.saveBatch(ck.get(m));
           }
       }
        System.out.println(new Date());

耗时24秒 明显看出来分批插入是占有优势的了。响应速度也是比那个一条一条的插入速度快很多。提高了有两倍的性能 4.这里说一下这么写需要注意的几个点。
  1. 因为mysql数据库插入语句有大小的限制,我百度到的是4M,所以这里不能一次性全部插入,mysql会报异常的。这里我一次插入400个试题对象 。
  2. 我数据库主键不是做的自增。做的字符串类型。这里批量插入的话,不知道是什么原因,总是报错,主键重复
    所以,我在遍历的时候给每个试题对象插入了一个UUID,保证不重复。

5.最后附上拆分list集合的方法,有需要用的可以拿走,改改就可以用
public List> ck(List list,Integer max){
        ArrayList> lists = new ArrayList<>();
        //5 0 1 2 3 4    max 2
        Integer i=list.size()%max;
        ArrayList strings = new ArrayList<>();
        for(int j=0;jmax) {
            for (int q = 0; q < list.size() / max; q++) {
                ArrayList tjInventories1 = new ArrayList();
                for (int k = q * max; k <= ((q + 1) * max - 1); k++) {
                    tjInventories1.add(list.get(k));
                }
                lists.add(tjInventories1);

            }
        }
        return lists;
    }

这里面 “ TjInventory ” 是我自己用到的实体对象。你们用的话可以把里面的实体对象名换成你们自己的实体对象就ok。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5696942.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存