大批量插入数据(sql insert)
1、批量录入(方法一:mybiats foreach标签)
所述的MySQL和Oracle的批量插入区别可以看出可能有兼容性问题(使用Oracle 的同学重点参考下)
而且jdbc链接Url要加上 allowMultiQueries=true参数。
*参考*
https://www.cnblogs.com/yangy608/p/3912580.html
<insert id="insertByExcel" parameterType="java.util.List">
insert into t_zd_fertilizer ( FertilizerTypeName,
FertilizerTradeName, FertilizerVender,
FertilizerN, FertilizerP, FertilizerK,
FertilizerContent, FertilizerUnit, FertilizerCreateTime,
FertilizerRemark, FertilizerPrice, FertilizerCommend)
values
<foreach collection="list" item="item" index="index" separator=",">
(#{item.fertilizerTypeName},
#{item.fertilizerTradeName}, #{item.fertilizerVender},
#{item.fertilizerN}, #{item.fertilizerP}, #{item.fertilizerK},
#{item.fertilizerContent}, #{item.fertilizerUnit}, #{item.fertilizerCreateTime},
#{item.fertilizerRemark}, #{item.fertilizerPrice}, #{item.fertilizerCommend})
</foreach>
</insert>
2、批量录入(方法二:mybatis ExecutorType.BATCH)
下边这个是Mybatis的官方示例:
// jdbc 方式
@Test
void testInsert() {
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
User user1 = new User(null, "Pocoyo");
sqlSession.insert("insert", user1);
User user2 = new User(null, "Valentina");
sqlSession.insert("insert", user2);
sqlSession.flushStatements();
assertEquals(Integer.valueOf(50), user1.getId());
assertEquals(Integer.valueOf(50), user2.getId());
sqlSession.commit();
}
//另外openSession方法第二个参数是设置是否自动提交,可以设置为flase。
//这里提到拿到批量更新结果的方式支持拿到批量结果。
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
List<User> users = sqlSession.selectList("select");
Assertions.assertEquals( 2, users.size());
}
}
// mapper 方式
@Test
void testInsertWithMapper() {
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH)) {
Mapper userMapper = sqlSession.getMapper(Mapper.class);
User user1 = new User(null, "Pocoyo");
userMapper.insert(user1);
User user2 = new User(null, "Valentina");
userMapper.insert(user2);
sqlSession.flushStatements();
assertEquals(Integer.valueOf(50), user1.getId());
assertEquals(Integer.valueOf(50), user2.getId());
sqlSession.commit();
}
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
List<User> users = sqlSession.selectList("select");
Assertions.assertEquals(2, users.size());
}
}
手工改造一下:
public void insertBatch(Map<String,Object> paramMap, List<User> list) throws Exception {
// 新获取一个模式为BATCH,自动提交为false的session
// 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
try {
if(null != list || list.size()>0){
int lsize=list.size();
for (int i = 0, n=list.size(); i < n; i++) {
User user= list.get(i);
user.setIndate((String)paramMap.get("indate"));
user.setDatadate((String)paramMap.get("dataDate"));//数据归属时间
//session.insert("com.xx.mapper.UserMapper.insert",user);
//session.update("com.xx.mapper.UserMapper.updateByPrimaryKeySelective",_entity);
session.insert(“包名+类名", user);
if ((i>0 && i % 1000 == 0) || i == lsize - 1) {
// 手动每1000个一提交,提交后无法回滚
session.commit();
// 清理缓存,防止溢出
session.clearCache();
}
}
}
} catch (Exception e) {
// 没有提交的数据可以回滚
session.rollback();
e.printStackTrace();
} finally {
session.close();
}
}
//另外这里提供批量执行的结果的打印函数 参考: https://blog.csdn.net/w605283073/article/83064000
public void printBatchResults(List<BatchResult> results) {
if (results.size() > 0) {
StringBuilder sb = new StringBuilder();
sb.append("Batch summary:\n");
for (int i = 0; i < results.size(); i++) {
BatchResult result = results.get(i);
sb.append("Result ").append(i).append(":\t");
sb.append(result.getSql().replaceAll("\n", "").replaceAll("\\s+", " ")).append("\t");
sb.append("Update counts: ").append(Arrays.toString(result.getUpdateCounts())).append("\n");
}
logDebug("082", sb.toString());
}
}
3、脚本录入测试(MYSQL)
这是今天做测试的时候需要批量insert到一张表中20万条数据时使用到的测试脚本,记录一下:
declare @i varchar(max) --声明一个变量作为循环条件--
set @i=1
while @i<1000001 --执行100000次 insert--
begin
insert INTO
表名(id,name,time) values('12345678'+@i,'小明','13527748096')
set @i=@i+1
end
大批量插入数据(sql insert)的更多相关文章
- MySQL大批量插入数据
MySQL大批量插入数据 1. 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据. ALTER TABLE tblname DISABLE KEYS; loading the ...
- 通过数组方式向Oracle大批量插入数据(10万条11秒)
1.创建数据库Person CREATE TABLE Person( id number, name nvarchar2() , age number , sex nvarchar2() , pass ...
- Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名
Oracle数据库,用mybatic批量插入数据: <insert id="saveBatch" parameterType="io.renren.entity.N ...
- mysql插入数据时 insert IGNORE、ON DUPLICATE KEY UPDATE、replace into
转: mysql insert时几个操作DELAYED .IGNORE.ON DUPLICATE KEY UPDATE的区别 博客分类: mysql基础应用 mysql insert时几个操作DE ...
- 【转载】MyBatis批量插入数据(insert)
介绍:MyBatis批量插入数据,原理就是在xml文件中添加 foreach 语句,然后MyBatis自动在values后面添加多个括号: XML文件如下: <?xml version=&quo ...
- 插入数据:insert,replace
*insert高级用法* 1.语法:insert into tbname(字段列表) values 值列表; 1.1可以不将所有的字段都插入数据.如果说需要完成部分字段的插入,需要必须存在字段列表. ...
- .NET大批量插入数据到Oracle
跟一个第三方系统做接口,需要插入几百万条数据到Oracle数据库. 下载Oracle的Managed版本的ODP.NET组件,只需要一个Oracle.ManagedDataAccess.dll这个DL ...
- 自动插入数据sql
oracle自动插入一定大小的数据: create tablespace TABLESPACE datafile 'E:\TABLESPACE.dbf' size 10g autoextend on ...
- 避免重复插入数据sql server
insert into TN_JOBS(JAVA_ID,SERVER_IP,SERVER_PORT,JOB_CODE,JOB_NAME,JOB_START_TIME,JOB_MSG,JOB_STATU ...
- 集群Redis使用 Python pipline大批量插入数据
class myRedis(object): def __init__(self,redis_type=None,**args): if redis_type == " ...
随机推荐
- Design as You See FIT 阅读笔记
Design as You See FIT 作者及会议名称:DATE 2009, Daniel Holcomb, UC Berkeley 本文的重点贡献:提出了一种新方法计算时序电路发生系统级故障对输 ...
- 迁移学习()《Attract, Perturb, and Explore: Learning a Feature Alignment Network for Semi-supervised Domain Adaptation》
论文信息 论文标题:Attract, Perturb, and Explore: Learning a Feature Alignment Network for Semi-supervised Do ...
- 记一次python写爬虫爬取学校官网的文章
有一位老师想要把官网上有关数字化的文章全部下载下来,于是找到我,使用python来达到目的 首先先查看了文章的网址 获取了网页的源代码发现一个问题,源代码里面没有url,这里的话就需要用到抓包了,因为 ...
- 音频处理库性能对比:计算mel频谱的速度哪个更快?
介绍 音频信号处理在各种应用中都发挥着重要的作用,如语音识别.音乐信息检索.语音合成等.其中,Mel频谱是一种常用的频域特征表示方法,用于描述人类听觉系统对频率的敏感程度. 在深度学习音频领域,mel ...
- 基于ChatGPT用AI实现自然对话
1.概述 ChatGPT是当前自然语言处理领域的重要进展之一,通过预训练和微调的方式,ChatGPT可以生成高质量的文本,可应用于多种场景,如智能客服.聊天机器人.语音助手等.本文将详细介绍ChatG ...
- AI 绘画基础 - 细数 Stable Diffusion 中的各种常用模型 【🧙 魔导士装备图鉴】
AI 绘画新手魔导士在刚开始玩 Stable Diffusion 时总会遇到各种新的概念,让人困惑,其中就包括各种模型和他们之间的关系. 魔法师入门得先认识各种法师装备(各种模型),让我们遇到问题知道 ...
- 万字长文详解如何使用Swift提高代码质量
前言 京喜APP最早在2019年引入了Swift,使用Swift完成了第一个订单模块的开发.之后一年多我们持续在团队/公司内部推广和普及Swift,目前Swift已经支撑了70%+以上的业务.通过使用 ...
- 云原生背景下如何配置 JVM 内存
背景 前段时间业务研发反馈说是他的应用内存使用率很高,导致频繁的重启,让我排查下是怎么回事: 在这之前我也没怎么在意过这个问题,正好这次排查分析的过程做一个记录. 首先我查看了监控面板里的 Pod 监 ...
- select_related和prefetch_related函数
在数据库存在外键的其情况下,使用select_related()和prefetch_related()很大程度上减少对数据库的请求次数以提高性能 在表中查找数据的时候,使用外键表related_nam ...
- 【.NET】C#/.NET新建项目sln,增加src和test文件夹问题和解决方案
问题介绍 经常逛github找优秀的.NET项目看,看到github上的项目的层级有src test,sln放在外层.如下图: 发现自己再Visaul Studio新建的项目即使添加了src和te ...