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 ...
随机推荐
- 基于SurfaceView的可拖动视频控件
视频播放控件(一) 可拖动,变换SurfaceView public class DragSurfaceView extends SurfaceView implements View.OnTouch ...
- Android中使用ViewGroup.removeViews()时出现NullPointException解决方案
在ViewGroup的内部写一个动画效果,在效果结束之后会调用onAnimationEnd(Animation arg0),在此方法中如果直接使用removeViews()时,可能会出现NullPoi ...
- 用static声明外部变量与内、外部函数
1.用static声明外部变量 若希望某些外部变量只限于被本文件引用,而不能被其他文件引用,可以在定义外部变量时加一个static声明. 例:(file1.c) #include <stdafx ...
- 在win7下python的xlrd和xlwt的安装于应用
1. http://pypi.python.org/pypi/xlwt 和http://pypi.python.org/pypi/xlrd下载xlwt-0.7.4.tar.gz和xlrd-0.7.7. ...
- (转)Spring Boot 2 (六):使用 Docker 部署 Spring Boot 开源软件云收藏
http://www.ityouknow.com/springboot/2018/04/02/docker-favorites.html 云收藏项目已经开源2年多了,作为当初刚开始学习 Spring ...
- springcloud(十五):Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway
Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...
- PHP防盗链的基本思想&&防盗链的设置方法
PHP防盗链的基本思想&&防盗链的设置方法 网站盗链会大量消耗被盗链网站的带宽,而真正的点击率也许会很小,严重损害了被盗链网站的利益.本文主要介绍用PHP实现防盗链的方法以及基本思想, ...
- Leetcode:263
编写一个程序判断给定的数是否为丑数.丑数就是只包含质因数 2, 3, 5 的正整数.示例 1:输入: 6输出: true解释: 6 = 2 × 3示例 2:输入: 8输出: true解释: 8 = 2 ...
- 基于SpringBoot的项目管理后台
代码地址如下:http://www.demodashi.com/demo/13943.html 一.项目简介 在使用本项目之前,需要对SpringBoot,freemaker,layui,flyway ...
- sku回忆笔记
分类表:(商品分类编号, 分类名称, 父分类编号)(1, 男装, 0)(2, 裤子, 1)(3, 外套, 1)(4, 内裤, 1)(5, 袜子, 1) 商品表:(商品编号, 商品名称, 商品分类编号, ...