大批量插入数据(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 == " ...
随机推荐
- 五月二十六日jdbc算法以及数据库
1.在PreparedStatement创建SQL对象后,调用preparedStatement()方法时,通过占位符?来按照索引进行SQL语句动态执行通过setString()方法和setInt() ...
- 解决svn本身上传没有权限和配置自动更新的钩子
第一步 :建立你的web程序目录和版本库目录 mkdir /data/webwww/project1 svnadmin create /data/svnwww/project1 进入/data/web ...
- Java学习笔记08
1. static关键字 static可以用来修饰的成员变量和成员方法,被static修饰的成员是属于类的是放在静态区中,没有static修饰的成员变量和方法则是属于对象的. 1.1 静态变量 ...
- Java中的同步
Java中的同步 线程间的通讯首要的方式就是对字段及其字段所引用的对象的共享访问.这种通信方式是及其高效的,但是也是导致了可能的错误:线程间相互干涉和内存一致性的问题.避免出现这两种错误的方法就是 ...
- 最新版新款影视直播粉红色UI的CMS源码/带教程/支付已接
demo软件园每日更新资源,请看到最后就能获取你想要的: 1.最新版新款影视直播粉红色UI的麻豆CMS源码/带教程/支付已接 基于苹果CMS v10影视系统框架开发的前端模板,带会员中心,可设置试看付 ...
- 苞米豆的多数据源 → dynamic-datasource-spring-boot-starter,挺香的!
开心一刻 2023年元旦,我妈又开始了对我的念叨 妈:你到底想多少岁结婚 我:60 妈:60,你想找个多大的 我:找个55的啊,她55我60,结婚都有退休金,不用上班不用生孩子,不用买车买房,成天就是 ...
- PowerBI(一) : 如何将powerBI报表嵌入内部web应用程序?
最近做了一个PowerBI报表嵌入内部web应用系统的项目,分享一下主要步骤以及踩坑记录. 微软官网完整教程这里:https://learn.microsoft.com/zh-cn/power-bi/ ...
- [OpenCV-Python] 7 把鼠标当画笔
文章目录 OpenCV-Python: II OpenCV 中的 Gui 特性 7 把鼠标当画笔 7.1 简单演示 7.2 高级一点的示例 OpenCV-Python: II OpenCV 中的 Gu ...
- dos命令、变量、字符编码、注释、用户输入
一.dos命令 1.dos命令 c: 切换盘符 cd c:\pthon 切换路径 dir 查看目录下的文件 cd .. 返回到上一层目录 cd ../.. 返回到上一层的上一层目录 二.环境变量的配置 ...
- 2022-04-25:给定一个整数数组,返回所有数对之间的第 k 个最小距离。一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值。 输入: nums = [1,3,1] k = 1 输出:
2022-04-25:给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 输入: nums = [1,3,1] k = 1 输出: ...