大批量插入数据(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 == " ...
随机推荐
- [Java SE]反射之Class
1 获取 指定Class 的类名 package cn.johnnyzen.bd.gatewayservice; import org.junit.Test; @Test public void ge ...
- Vulnhub Development靶场 Walkthrough
Recon 首先使用netdiscover进行二层Arp扫描. ┌──(kali㉿kali)-[~] └─$ sudo netdiscover -r 192.168.80.0/24 Currently ...
- 部署:windows7下mysql8.0.18部署安装
一.前期准备(windows7+mysql-8.0.18-winx64) 1.下载地址:https://dev.mysql.com/downloads/ 2.选择直接下载不登录账号,下载的压缩包大概两 ...
- 最新版本 Stable Diffusion 开源 AI 绘画工具之中文自动提词篇
目录 标签生成器 提示词自动补全 标签生成器 由于输入正向提示词 prompt 和反向提示词 negative prompt 都是使用英文,所以对学习母语的我们非常不友好 使用网址:https://t ...
- Qt 加载 libjpeg 库出现“长跳转已经运行”错误
继上篇 Qt5.15.0 升级至 Qt5.15.9 遇到的一些错误 篇幅有点长,先说解决方法,在编译静态库时加上 -qt-libjpeg,编译出 libjpeg 库后,在项目中使用 #pragma c ...
- Array.prototype.at。Arrat和 String 中的 at 方法
一篇有关新 js 特性 at 方法的思考 入参只能是number 类型,允许入参有小数(按照 chrome DevTools Console 测试确实可以带小数) 有返回值,如果对应下标在实例中存在, ...
- 这可能是最全面的MySQL面试八股文了
什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...
- C# ConfigureWait
ConfigureAwait 参数为bool类型.true:尝试将延续任务封送回原始上下文 我们一般使用的是false,用于避免强制在原始上下文或调度程序中进行回调. 原理: 以await DoSom ...
- Python-pprint的简单使用
Data pretty printer 一.简介 print()和pprint()都是python的打印模块,功能基本一样,唯一的区别就是pprint()模块打印出来的数据结构 ...
- workerman、websocket简单聊天功能从0到1实现
一.workerman安装,测试环境为linux 1.在网站根目录,用命令行安装,要是出现root权限提示,输入y回车就行,或者新建一个用户再进入安装 Linux系统可以使用以下脚本测试本机PHP环境 ...