2019独角兽企业重金招聘Python工程师标准>>>

一、mybiats foreach标签

foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

  1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
  2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
  3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了
具体用法如下:
<insert id="insertBatch" parameterType="List">INSERT INTO TStudent(name,age)<foreach collection="list" item="item" index="index" open="("close=")"separator="union all">SELECT #{item.name} as a, #{item.age} as b FROM DUAL</foreach>
</insert>

二、mybatis ExecutorType.BATCH

Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的

具体用法如下:

*方式一 spring+mybatis 的

//获取sqlsession
//从spring注入原有的sqlSessionTemplate
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
// 新获取一个模式为BATCH,自动提交为false的session
// 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);//通过新的session获取mapperfooMapper = session.getMapper(FooMapper.class);int size = 10000;try{for(int i = 0; i < size; i++) {Foo foo = new Foo();foo.setName(String.valueOf(System.currentTimeMillis()));//session.insert("com.xx.mapper.UserMapper.insert",foo);//session.update("com.xx.mapper.UserMapper.updateByPrimaryKeySelective",foo);// session.insert(“包名+类名", foo);fooMapper.insert(foo); //这里要么是用session那样去新建,要么是用新获取的mapperif(i % 1000 == 0 || i == size - 1) {//手动每1000个一提交,提交后无法回滚 session.commit();//清理缓存,防止溢出session.clearCache();}}} catch (Exception e) {//没有提交的数据可以回滚session.rollback();} finally{session.close();}
  • spring+mybatis

方法二:

结合通用mapper sql别名最好是包名+类名

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();}}

========== 经过测试,上面的这个还是对的。 主要是session.insert(“包名+类名", user); 这个一定要设置对。

转载于:https://my.oschina.net/u/202293/blog/741949

mybatis 批量插入的两种方式相关推荐

  1. MyBatis批量插入的五种方式

    MyBatis利用For循环批量插入 MyBatis的手动批量提交 MyBatis以集合方式批量新增(推荐) MyBatis-Plus提供的SaveBatch方法 MyBatis-Plus提供的Ins ...

  2. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  3. MyBatis获取参数值的两种方式以及传参情况

    MyBatis获取参数值的两种方式 MyBatis获取参数值的两种方式:${}和#{} 传参情况 演示环境 1.单个字面量类型的参数 2.多个字面量类型的参数 3.map集合类型的参数 4.实体类类型 ...

  4. java并行任务,Java 并发编程学习(五):批量并行执行任务的两种方式

    Java 并发编程学习(五):批量并行执行任务的两种方式 背景介绍 有时候我们需要执行一批相似的任务,并且要求这些任务能够并行执行.通常,我们的需求会分为两种情况: 并行执行一批任务,等待耗时最长的任 ...

  5. SSM整合之Mybatis笔记( MyBatis获取参数值的两种方式(重要))(P020—P025)

    P20 MyBatis获取参数值的两种方式(重要) 一.什么叫做获取取参数值的两种方式 以后在我们开发是方向B/S系统,然后我们现在要做的任务通过浏览器/页面/视图 收集用户输入的一些数据,然后把这些 ...

  6. Mybatis关联查询的两种方式

    首先要了解对象的三种关联方式 *数据库表的关联关系有三种,一对一,一对多,多对多 一对一   是通过在任意一方的主键,引入对方主键作为外键来实现的,就是说主键与外键为同一字段 一对多   是通过在&q ...

  7. jdbc批量插入的4种方式【百万条数据插入只需几秒】

    mysql数据库准备 #打开数据库test01; use test01; #创建表a,表a包含int型的id列.可变长度型的name[长度20个字符] create table a (id INT,N ...

  8. 【MyBatis】关于MyBatis批量更新的几种方式

    1. Java代码循环执行sql,逐条更新 这种方式就是将需要更新的数据,循环调用update方法去更新数据,实现代码如下: public void test() {// 需要更新的集合List< ...

  9. 实战演练 | 批量插入的三种方式

    最近,我写了一个 node.js 脚本,每天要循环访问数百万个文件,并将其内容插入 MySQL 数据库.该脚本不是一次处理一条记录,而是将文件内容存储在内存中,然后每 1000 个文件运行一次 INS ...

最新文章

  1. linux 唯一行数量,linux – 确定bash中具有awk或类似内容的唯一行数
  2. 解决WinCE自动挂起的问题
  3. Silverlight Blend动画设计系列十二:三角函数(Trigonometry)动画之自由旋转(Free-form rotation)...
  4. 对当今社会的某些现象的感想
  5. iview 3.x 升级指南 —— Icon 篇
  6. Python 爬虫+tkinter界面 实现历史天气查询
  7. linux系统取代windows,Linux不可能取代Windows
  8. JavaScript中DOM的层次节点(一)
  9. 拓端tecdat|Python随机波动率(SV)模型对标普500指数时间序列波动性预测
  10. Node.js丶Stream使用及常用方法
  11. 编程c语言中文图形代码,C语言图形编程代码
  12. Excel文本如何间隔指定字符插入分隔符
  13. mac 文字识别软件ocr_树洞OCR文字识别软件for mac-树洞OCR文字识别mac版v1.2.0 最新版-腾牛苹果网...
  14. esxi虚拟化是基于linux吗,虚拟化 – 如何在虚拟机中运行VMWare ESX或ESXi?
  15. 用Windows自带的画图软件拼接(合成)多张图片
  16. rsa java模数_RSA加密:利用模数和指数生成公钥加密
  17. 常见网络攻击原理及其防御
  18. 数学建模之:匈牙利算法python代码
  19. 凡事不可过....久视伤血,久卧伤气,久坐伤肉,久立伤骨,久行伤筯(摘于好友QQ)
  20. Unity2019新建空项目都报错(有两个看不到的红色报错)怎么解决?

热门文章

  1. 实现前后台数据交互(上传/回传单个JSON数据和上传/回传JSON数组)
  2. Python的Lock对象和Condition对象对比
  3. java thread 内存泄露_记一次ThreadLocal引发的内存泄露
  4. java filechooser_Java—FileChooser(示例代码)
  5. redis set不可重复_Redis的使用
  6. 数字计算机的分类依据,数字计算机模拟计算机分类依据
  7. vs运行html没有注册类,解决win10运行com提示“错误代码 80040154-没有注册类”的方法...
  8. 位运算(、|、^、~、>>、<<)
  9. VB 将文件夹复制到指定目录
  10. 特斯拉又熬过破产危机后,马斯克说自动驾驶芯片已经准备好了