mybatis之批量插入
一.导入功能优化
普通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之批量插入的更多相关文章
- mybatis foreach批量插入数据:Oracle与MySQL区别
mybatis foreach批量插入数据:Oracle与MySQL不同点: 主要不同点在于foreach标签内separator属性的设置问题: separator设置为","分 ...
- Mybatis+mysql批量插入性能分析测试
前言 今天在网上看到一篇文章(后文中的文章指的就是它) https://www.jianshu.com/p/cce617be9f9e 发现了一种有关于mybatis批量插入的新方法,而且看了文章发现我 ...
- mysql基础---->mybatis的批量插入(一)
这里面记录一下使用mybatis处理mysql的批量插入的问题,测试有可能不准.只愿世间风景千般万般熙攘过后,字里行间,人我两忘,相对无言. mybatis的批量插入 我们的测试主体类是springb ...
- mybatis + mysql 批量插入、删除、更新
mybatis + mysql 批量插入.删除.更新 Student 表结构 批量插入 public int insertBatchStudent(List<Student> studen ...
- mybatis+mysql批量插入和批量更新、存在及更新
mybatis+mysql批量插入和批量更新 一.批量插入 批量插入数据使用的sql语句是: insert into table (字段一,字段二,字段三) values(xx,xx,xx),(oo, ...
- MyBatis原生批量插入的坑与解决方案!
前面的文章咱们讲了 MyBatis 批量插入的 3 种方法:循环单次插入.MyBatis Plus 批量插入.MyBatis 原生批量插入,详情请点击<MyBatis 批量插入数据的 3 种方法 ...
- mybatis中批量插入的两种方式(高效插入)
MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...
- Mybatis 实现批量插入和批量删除源码实例
Mybatis 实现批量插入数据和批量删除数据 学习内容: 准备工作 1.数据库新建表 2.新建 Maven 项目和设置编译版本及添加依赖 3.新建 db.properties 4.新建 mybati ...
- 161102、MyBatis中批量插入
方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...
随机推荐
- 排序算法之折半插入排序的思想以及Java实现
1 基本思想 折半插入排序(binary insertion sort)的基本原理与直接插入排序相同,不同之处在于,确定当前记录在前面有序子数组中的位置时,直接插入排序是采用顺序查找的方法,而折半插入 ...
- June 1. 2018 Week 22nd Friday
What makes life dreary is the want of motive. 没有了目的,生活便暗淡无光. We all have dreams about our future, we ...
- Java同步(Synchronization)
前言 线程间的通信主要通过共享对字段的访问和对象引用字段的引用,可能会产生两种错误,线程干扰和内存一致性错误.Java的同步就是防止这些错误,但当多个线程访问同一资源会导致线程执行缓慢,甚至暂停执行. ...
- 谱聚类算法(Spectral Clustering)
谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法--将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的 ...
- 大数据计算平台Spark内核全面解读
1.Spark介绍 Spark是起源于美国加州大学伯克利分校AMPLab的大数据计算平台,在2010年开源,目前是Apache软件基金会的顶级项目.随着Spark在大数据计算领域的暂露头角,越来越多的 ...
- nginx 学习笔记
Nginx是一个自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.POP3.SMTP代理服务器:nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作 ...
- ThreadLocal源码调试——“this”作为key
前言:在一次面试过程中被问到ThreadLocal,大家都知道ThreadLocal可以为每个线程单独提供一个副本,从而实现变量间的隔离.在ThreadLocal中set和get操作的key是什么,T ...
- wait和notify
① wait() 与 notify/notifyAll 方法必须在同步代码块中使用 synchronized修饰的同步代码块或方法里面调用wait() 与 notify/notifyAll()方法 ...
- 【转】怎么给javascript + div编辑框光标位置插入表情文字等?
最近刚好碰到这个问题,虽然离提出问题已经过了半年了,本着前人栽树后人乘凉的精神,还是回答一下.效果: &amp;amp;lt;img src="https://pic2.zh ...
- Rsync服务实战
目录 1 安装rsync软件 2 配置 /etc/rsyncd.conf 3 创建用户(运行rsync服务的用户身份) 4 创建虚拟用户密码文件(客户端连接时候使用) 5启动 rsync 服务,并加入 ...