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 ...
随机推荐
- 2016某知名互联网公司PHP面试题及答案(续)
1 写出mysql中,插入数据,读出数据,更新数据的语句 INSERT INTO 表名 VALUES ("",""): SELECT * FROM 表名:. U ...
- cmd是命令提示符吗?
经常使用电脑的小伙伴对cmd有所了解,它能帮我们快速解决问题.搜索框中输入“cmd”,就可以看到命令提示符程序了.那么,命令提示符程序和cmd到底有着什么样的联系呢?下面就为大家讲解一下. CMD是c ...
- February 19th, 2018 Week 8th Monday
Love is blind, hard to find, difficult to get, and impossible to forget. 爱,很盲目,很难找,很难得,很难忘. It is al ...
- java 开发注意事项
开发过程中的一些经验总结,不定时更新 1, 在开发接口的时候,尽量一个接口一个功能,不要多个功能共用一个接口,以免后期需求更改时修改接口困难, 使逻辑复杂
- linux学习笔记整理(四)
第五章 Vim编辑器和恢复ext4下误删除的文件-Xmanager工具本节所讲内容:5.1 vim的使用5.2 实战:恢复ext4文件系统下误删除的文件5.3 实战:使用xmanager等远程连接工具 ...
- python六十六课——单元测试(二)
''' 封装Person类 ''' class Person: def __init__(self,name,age): self.name=name self.age=age def getAge( ...
- 关于.NET Web API InputStream接收不了数据的问题
问题描述:1.网站向WebApi(以下简称Api) Post数据: 2.Api的过滤器先处理验证,通过HttpContext.Current.Request.InputStream获取网站Post过来 ...
- 电脑如何用HDMI连接电视
因为现在的液晶电视基本上都有VGA接口,所以你可以很容易地用VGA线实现电脑连接电视上,但是该文有一个地方没有提到,那就是分辨率的问 题,现在的液晶电视的主流面板已经是全高清面板(1920X1080) ...
- 【js】统计数组中某些项的个数
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- truffle框架的简单使用
truffle 给大家介绍一下这个框架怎么使用,其实把这个框架就是你们看我之前有一个教程是教你们怎么用remix-ide来连接私有链,编译,配置合约,然后进行调用的,truffle其实就是把这个步骤放 ...