一.导入功能优化

普通for循环,对于导入大量数据时非常耗时。可以通过Mybatis的批量插入功能提高效率。
每批次导入的数据不能太多,否则会报错。通过测试发现,每批次200条为宜。

测试结果:
开启事务情况下:

            文件大小(k)    时长(ms)    测试次数    数据量(条数)
batchInsert:    292        400          5        3000
             240        230          3        2000
             187        110          3        1000
             104        70           5        500
             292        8700         5        3000
for:            240        5800         3        2000
                187        3200         3        1000
                104        1500         2        500
        

1.Service

@Override
    @Transactional
    public String importListTest(InputStream in, String fileName) {
        int num = 0;

        String[][] table = null;
        String msg = null;
        try {
            table = ExcelUtils.readExcel(in,fileName,0);
        } catch (Exception e) {
            e.printStackTrace();
            return "文件导入失败,请检查文件格式!";
        }
        Map<String,Integer> tableColumMap = new HashMap<String, Integer>();
        if (CheckUtils.isNullOrBlank(table)
                || table.length == 0) {
            return "表格中没有任何数据!";
        }
        if (table.length == 1) {
            return "表格中只存在表头数据!";
        }
        //校验导入文件内容
        for (int i = 0; i < table[0].length; i++) {
            String cell = table[0][i].trim();
            tableColumMap.put(cell, i);
        }

        List<String> errorMsgs = new ArrayList<String>();
        String[] titles ={"源声ID","源声描述","产品名称","产品内部型号","产品外部型号","ROM版本","系统版本","创建时间","IMEI","SN","问卷次数","满意度得分(问题1)","推荐值得分(问题2)"};
        for (int i = 0; i < titles.length; i++) {
            String title = titles[i];
            if(!tableColumMap.containsKey(title)){
                errorMsgs.add("Excel表格表头列有误,不存在"+title+"列,请修改Excel后导入");
                if(errorMsgs.size() >= 10) return "导入文件表头不正确,请检查后重新导入!";
            }
        }

        long start = System.currentTimeMillis();
        if (errorMsgs.size() == 0) {

            NPSSourceAnalysis npsSourceAnalysis=new NPSSourceAnalysis();

            for (int i = 1; i < table.length; i++) {
                String sourceID = table[i][tableColumMap.get("源声ID")].trim();
                String descript = table[i][tableColumMap.get("源声描述")].trim();

                if(descript.length()>1000){
                     descript = (String) descript.subSequence(0, 999);
                }
                String product = table[i][tableColumMap.get("产品名称")].trim();
                String inner = table[i][tableColumMap.get("产品内部型号")].trim();
                String outer = table[i][tableColumMap.get("产品外部型号")].trim();
                String ROM = table[i][tableColumMap.get("ROM版本")].trim();
                String createTime = table[i][tableColumMap.get("创建时间")].trim();
                String SN = table[i][tableColumMap.get("SN")].trim();
                String CSR = table[i][tableColumMap.get("满意度得分(问题1)")].trim();
                String recommend = table[i][tableColumMap.get("推荐值得分(问题2)")].trim();

                npsSourceAnalysis.setSourceID(Integer.parseInt(sourceID));
                npsSourceAnalysis.setDescript(descript);
                npsSourceAnalysis.setProduct(product);
                npsSourceAnalysis.setInnerVersion(inner);
                npsSourceAnalysis.setOuterVersion(outer);
                npsSourceAnalysis.setROM(ROM);
                npsSourceAnalysis.setCreateTime(createTime);
                npsSourceAnalysis.setSN(SN);
                npsSourceAnalysis.setCSR(Integer.parseInt(CSR));
                npsSourceAnalysis.setRecommend(Integer.parseInt(recommend));
                nPSSourceAnalysisMapper.insertTest(npsSourceAnalysis);    

            }
            msg = "success-import:-"+num+"-items";
        } else{
            for (String errorMsg : errorMsgs) {
                msg = msg + errorMsg +";";
            }
        }

        /*if (errorMsgs.size() == 0) {

            int total = table.length/200 + 1;
            for (int j = 0; j < total-1; j++) {

                List<NPSSourceAnalysis> list = new ArrayList<NPSSourceAnalysis>();

                for (int i = 1+200*j; i < 1+200+200*j; i++) {
                    NPSSourceAnalysis npsSourceAnalysis=new NPSSourceAnalysis();
                    String sourceID = table[i][tableColumMap.get("源声ID")].trim();
                    String descript = table[i][tableColumMap.get("源声描述")].trim();

                    if(descript.length()>1000){
                         descript = (String) descript.subSequence(0, 999);
                    }
                    String product = table[i][tableColumMap.get("产品名称")].trim();
                    String inner = table[i][tableColumMap.get("产品内部型号")].trim();
                    String outer = table[i][tableColumMap.get("产品外部型号")].trim();
                    String ROM = table[i][tableColumMap.get("ROM版本")].trim();
                    String createTime = table[i][tableColumMap.get("创建时间")].trim();
                    String SN = table[i][tableColumMap.get("SN")].trim();
                    String CSR = table[i][tableColumMap.get("满意度得分(问题1)")].trim();
                    String recommend = table[i][tableColumMap.get("推荐值得分(问题2)")].trim();
                    npsSourceAnalysis.setSourceID(Integer.parseInt(sourceID));
                    npsSourceAnalysis.setDescript(descript);
                    npsSourceAnalysis.setProduct(product);
                    npsSourceAnalysis.setInnerVersion(inner);
                    npsSourceAnalysis.setOuterVersion(outer);
                    npsSourceAnalysis.setROM(ROM);
                    npsSourceAnalysis.setCreateTime(createTime);
                    npsSourceAnalysis.setSN(SN);
                    npsSourceAnalysis.setCSR(Integer.parseInt(CSR));
                    npsSourceAnalysis.setRecommend(Integer.parseInt(recommend));
                    list.add(npsSourceAnalysis);
                }
                nPSSourceAnalysisMapper.batchInsert(list);
            }

            //最后不够200条
            List<NPSSourceAnalysis> list = new ArrayList<NPSSourceAnalysis>();

            for (int i = 1+200*(total-1); i < table.length; i++) {
                NPSSourceAnalysis npsSourceAnalysis=new NPSSourceAnalysis();
                String sourceID = table[i][tableColumMap.get("源声ID")].trim();
                String descript = table[i][tableColumMap.get("源声描述")].trim();

                if(descript.length()>1000){
                     descript = (String) descript.subSequence(0, 999);
                }
                String product = table[i][tableColumMap.get("产品名称")].trim();
                String inner = table[i][tableColumMap.get("产品内部型号")].trim();
                String outer = table[i][tableColumMap.get("产品外部型号")].trim();
                String ROM = table[i][tableColumMap.get("ROM版本")].trim();
                String createTime = table[i][tableColumMap.get("创建时间")].trim();
                String SN = table[i][tableColumMap.get("SN")].trim();
                String CSR = table[i][tableColumMap.get("满意度得分(问题1)")].trim();
                String recommend = table[i][tableColumMap.get("推荐值得分(问题2)")].trim();
                npsSourceAnalysis.setSourceID(Integer.parseInt(sourceID));
                npsSourceAnalysis.setDescript(descript);
                npsSourceAnalysis.setProduct(product);
                npsSourceAnalysis.setInnerVersion(inner);
                npsSourceAnalysis.setOuterVersion(outer);
                npsSourceAnalysis.setROM(ROM);
                npsSourceAnalysis.setCreateTime(createTime);
                npsSourceAnalysis.setSN(SN);
                npsSourceAnalysis.setCSR(Integer.parseInt(CSR));
                npsSourceAnalysis.setRecommend(Integer.parseInt(recommend));
                list.add(npsSourceAnalysis);
            }
            nPSSourceAnalysisMapper.batchInsert(list);            

            msg = "success-import:-"+num+"-items";
        } else{
            for (String errorMsg : errorMsgs) {
                msg = msg + errorMsg +";";
            }
        }*/

        long end = System.currentTimeMillis();
        logger.info("时长:"+(end-start));

            return msg;
     }

dao:

int batchInsert(List<NPSSourceAnalysis> list);

mapper:

<insert id="batchInsert" >
    insert into nps_source_analysis_test (sourceID, descript, product, innerVersion,outerVersion,ROM, createTime, SN, CSR, recommend)
    values
    <foreach item="item" index="index" collection="list" separator=",">
      (#{item.sourceID,jdbcType=INTEGER}, #{item.descript,jdbcType=NVARCHAR}, #{item.product,jdbcType=NVARCHAR},#{item.innerVersion,jdbcType=NVARCHAR},#{item.outerVersion,jdbcType=NVARCHAR},
       #{item.ROM,jdbcType=NVARCHAR}, #{item.createTime,jdbcType=NVARCHAR}, #{item.SN,jdbcType=NVARCHAR}, #{item.CSR,jdbcType=INTEGER}, #{item.recommend,jdbcType=INTEGER})
    </foreach>
</insert>

mybatis之批量插入的更多相关文章

  1. mybatis foreach批量插入数据:Oracle与MySQL区别

    mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...

  2. Mybatis+mysql批量插入性能分析测试

    前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我 ...

  3. mysql基础---->mybatis的批量插入(一)

    这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...

  4. mybatis + mysql 批量插入、删除、更新

    mybatis + mysql 批量插入.删除.更新 Student 表结构 批量插入 public int insertBatchStudent(List<Student> studen ...

  5. mybatis+mysql批量插入和批量更新、存在及更新

    mybatis+mysql批量插入和批量更新 一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo, ...

  6. MyBatis原生批量插入的坑与解决方案!

    前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入.MyBatis Plus 批量插入.MyBatis 原生批量插入,详情请点击<MyBatis 批量插入数据的 3 种方法 ...

  7. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  8. Mybatis 实现批量插入和批量删除源码实例

    Mybatis 实现批量插入数据和批量删除数据 学习内容: 准备工作 1.数据库新建表 2.新建 Maven 项目和设置编译版本及添加依赖 3.新建 db.properties 4.新建 mybati ...

  9. 161102、MyBatis中批量插入

    方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...

随机推荐

  1. [Hive_9] Hive 的排序

    0. 说明 全排序(order by) | 部分排序(sort by) | hash 分区(distribute by)  | cluster by 1. 前期准备 1.1 建表 create tab ...

  2. Stopwatch + C#打印日志方法

    打印一个接口.方法的运行时间在程序中是很容易遇到的一件事情:现在,我就分享一个我在工作中使用的临时打印日志的方法和结合 Stopwatch 打印测量某个时间间隔的运行时间的方法. Stopwatch ...

  3. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

  4. 聚类——KFCM

    聚类——认识KFCM算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 一.KFCM概述 KFCM:基于核的改进的模糊c均值聚类算法.它是通过核函数将 ...

  5. Spring的jdbc模板2:使用开源的连接池

    上篇简要介绍了如何在spring中配置默认的连接池和jdbc模板,这篇来介绍开源的连接池配置与属性引入 C3P0连接池配置: 引入jar包 配置c3p0连接池 <?xml version=&qu ...

  6. js模块化规范—commonjs

    commonjs规范说明 每个js文件都可当作一个模块 在服务器端: 模块的加载是运行时同步加载的(不会阻塞,等待时间回比较长).在浏览器端: 模块需要提前编译打包处理 commonjs规范基本语法 ...

  7. 【HNOI2018】排列

    [HNOI2018]排列 神仙贪心题. 题目说这么大堆东西就是想告诉你这是个森林,选了\(v\)的父亲后才能选\(v\). 我们设\(w_v\)为\(v\)所在联通块权值和,\(size_v\)表示\ ...

  8. 字符串类型的日期转化为Date类型

    //方法一:内部引用package com.th.mobula.test; import java.text.ParseException;import java.text.SimpleDateFor ...

  9. 如何征服面试官,拿到Offer [转]

    转自 https://my.oschina.net/cccyb/blog/3012768 又到了茶余饭后的时间,想想写点什么,掐指一算,噢呦,快到3月份了,职场的金三银四跳槽季又来了,不同的是今年比往 ...

  10. 解决Nginx+Tomcat下客户端https请求跳转成http的问题

    Nginx上开启https,  后端使用Tomcat,  两者间走http协议, 但发现如果tomcat应用存在跳转时, 则客户端浏览器会出现400 Bad Request的错误, 通过抓包发现原因是 ...