首页 > 其他分享 >mybatis中批量插入的两种方式(高效插入)

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

时间:2023-06-02 21:08:01浏览次数:28  
标签:语句 批量 list 插入 session user 提交 mybatis size


MyBatis简介

MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

一、mybiats foreach标签

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

如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

如果传入的参数是多个的时候,我们就需要把它们封装成一个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获取mapper
fooMapper = 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()));
fooMapper.insert(foo);
if(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();
}
}

标签:语句,批量,list,插入,session,user,提交,mybatis,size
From: https://blog.51cto.com/chengzheng183/6404827

相关文章

  • MyBatis-Plus 条件构造器(Wrapper)
    接口方法的参数中,会出现各种Wrapper,比如queryWrapper、updateWrapper等。Wrapper的作用就是用于定义各种各样的条件(where)。所以不管是查询、更新、删除都会用到Wrapper。Wrapper官方文档。MyBatis-Plus系列推荐阅读顺序:MyBatis-Plus快速上手MyBatis-Plus条件构造器(Wrapper)Myb......
  • 利用jira及confluence的API进行批量操作(查找/更新/导出/备份/删除等)
    前言:近期因为某些原因需要批量替换掉jira和confluence中的特定关键字,而且在替换前还希望进行备份(以便后续恢复)和导出(方便查看)atlassian官方的api介绍文档太简陋,很多传参都没有进一步的描述说明,过程中踩了不少的坑...故现将相关代码分享下,希望有类似需求的朋友能用得上,直接上代......
  • es 批量更新 _update_by_query
        {"script":{"source":"ctx._source['owner']=1610"},"query":{"term":{"categoryCId":{"value":807}}}} {"script":{"source":"ctx._source......
  • 软件测试|教你怎么向SQL中插入数据
    前言有的时候,我们需要向数据库表中写入新数据,但是我们不可能新建一个表,我们需要使用插入功能向数据库表中写入新数据。SQL提供了INSERTINTO的方法,满足我们向表中插入数据行的需求。INSERTINTOINSERTINTO的基本语法如下:按指定的列插入数据,语法如下:INSERTINTOtable_name(column......
  • Salesforce 中快速批量删除字段
    当字段已经被删除后,会进入到DeletedFields中,但是这些字段还是会占用当前对象的字段limit,下面我来介绍怎样快速harddelete这些在DeletedFields中的字段进入DeletedFields界面打开Chrome浏览器DeveloperTools界面切换到Consoletag下执行下面这段命令......
  • MyBatis之一级缓存、二级缓存
    1、一级缓存跟踪BaseExecutor可以看到,在query方法中,实现了缓存逻辑,当缓存不存在的时候,则调用实现类中的doQuery。创建一级缓存的KEY:查看缓存中是否存在,存在则直接返回,不存在则查询数据库:查询数据库:这就是Mybatis中的一级缓存,逻辑十分简单,可以从源码中看到,一级缓存是默认开......
  • [MyBatis]DAO层只写接口,不用写实现类
    团队开发一个项目,由老大架了一个框架,遇到了DAO层不用写接口了,我也是用了2次才记住这个事的,因为自己一直都是习惯于写DAO层的实现类,所以,习惯性的还是写了个实现类。于是遇到错误了。找不到那个方法。问了团队的人才知道,方法名和Mapper中配置的id名必须一样。实现:一、配置Spring集......
  • pandas 增加行 插入行
    pandas增加行方法locconcatpandas增加列方法[列名]#可结合np.where等判断函数concat(axis=1)merge#merge(how='left')+drop_duplicates(left_df.columns)==vlookupjoininsert......
  • MyBatis常见好用的插件
    阅读文本大概需要3分钟。0x01:MybatisPageHelper分页插件在没有分页插件之前,写一个分页需要两条SQL语句,一条查询一条统计,然后才能计算出页码,这样的代码冗余而又枯燥,更重要的一点是数据库迁移,众所周知不同的数据库分页写法是不同的,而Mybatis不同于Hibernate的是它只提供动态SQL和结......
  • 在web应用中使用mybatis
    1. 实现功能:52银⾏账户转账1.1 使⽤技术:HTML + Servlet + MyBatis1.2 WEB应⽤的名称:bank2. 数据库表的设计和准备数据  523. 注意MyBatis对象作⽤域以及事务问题   573.1 MyBatis核⼼对象的作⽤域   573.1.1 SqlSessionFactoryBuilder这个类可以被实例化、使⽤......