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 ...
随机推荐
- [Hive_add_10] Hive 的 serde (序列化 & 反序列化) 操作
0. 说明 serde 是序列化和反序列化 serialize & deserialize 是将文件中的字段映射成 Hive 中的列 1. 验证 1.1 openCSVSerde CSV 为逗 ...
- Xmanager power suit 6 最新版注册激活
Xmanager Power Suit 6.0.0012 最新版注册激活,长期更新 操作步骤 Xmanger Power Suit 官方 其实有两种 .exe 文件,一个是用于试用的,在注册的时候不能 ...
- [福大软工] Z班 团队作业——系统设计 作业成绩
团队作业--系统设计 作业链接 http://www.cnblogs.com/easteast/p/7709763.html 作业情况 这次作业大家完成度都很高,大家的团队分工,任务布置都安排得很到位 ...
- TCP Health Checks
This chapter describes how to configure health checks for TCP. Introduction NGINX and NGINX Plus can ...
- jsp 或 php 等view之中使用javascript简单处理的使用技巧
前端人员在jsp,php等后台mvc之的coding之时,前端人员常常需要一些少量的数据处理,直接使用js的方法无疑是开销最小的.使用的方法 使用在标签之中嵌套script标签,使用document. ...
- ES6切割原理
ES6提供了 ... 操作,下面简单演示如何切割对象 const params = { page: 1, pageSize: 10, name: '名字', age: '13', weight: '7 ...
- chrome-performance页面性能分析使用教程
运行时性能表现(runtime performance)指的是当你的页面在浏览器运行时的性能表现,而不是在下载页面的时候的表现.这篇指南将会告诉你怎么用Chrome DevTools Performa ...
- CROI R1
$CROI$ $R1$ 今天参加了一场比赛,什么比赛呢?CROI. CROI是什么呢? $Challestend$ $Rehtorbegnaro$ $OI$.总的来说就是我们机房的一些神仙出的题啦. ...
- POJ2749 Building roads
嘟嘟嘟 最近把21天漏的给不上. 今天重温了一下2-SAT,感觉很简单.就是把所有条件都转化成如果--必然能导出--.然后就这样连边建图,这样一个强连通分量中的所有点必然都是真或者假.从而根据这个点拆 ...
- 六、Oracle 存储过程
一.存储过程1语法:create procedure 名字is|as 声明变量begin 代码块end; 2.执行存储过程打开命令窗口,输入:exec 过程名字 3.打开输出命令:set server ...