MyBatis的批量更新或插入的正确姿势

简介: 之前写过一篇mybatis批量插入的文章:https://blog.csdn.net/w605283073/article/details/83064000

这次补充:


根据https://blog.csdn.net/huanghanqian/article/details/83177178所述千条以上的批量插入或者更新慎用foreach方式,ExecutorType.BATCH 的插入方式,性能显著提升


那么怎么使用这种方式?


可以参考我上面的那篇文章。



另外发现篇不错的介绍此内容的英文文章:http://pretius.com/how-to-use-mybatis-effectively-perform-batch-db-operations/


此处简单翻译如下:


MyBatis的批处理配置

@Bean

   @Primary

   public SqlSessionTemplate sqlSessionTemplate() throws Exception {

       return new SqlSessionTemplate(sqlSessionFactory());

   }

   @Bean(name=MyBatisProperties.BATCH_SQL_SESSION_TEMPLATE)

   public SqlSessionTemplate batchSqlSessionTemplate() throws Exception {

       return new SqlSessionTemplate(sqlSessionFactory(), ExecutorType.BATCH);

   }

可以使用上面两种session模板俩处理不同的模型:


1、标准- 标准的或单条操作


2、批量- 批量或者成块的处理


注意:一个session模板只能有一种处理模型


默认的mybatis mapper使用默认的标准的session模板,而不用批处理的session模板。


如果我们想要一个mapper使用批处理session,我们需要将其从其他mapper中分离。



BatchConfiguration配置类中的代码:


   public final static String BATCH_FORECAST_MAPPER = "batchForecastMapper";

   @Autowired

   @Qualifier(MyBatisProperties.BATCH_SQL_SESSION_TEMPLATE)

   private SqlSessionTemplate batchSqlSessionTemplate;

   @Bean

   public MapperFactoryBean batchForecastMapper() {

       MapperFactoryBean mapper = new MapperFactoryBean();

       mapper.setMapperInterface(ForecastMapper.class);

       mapper.setSqlSessionTemplate(batchSqlSessionTemplate);

       return mapper;

   }


简单的mapper类,要加上bean的名称为BatchConfiguration.BATCH_FORECAST_MAPPER


   public interface ForecastMapper {

       void createForecast(@Param("forecast") Forecast forecast, @Param("audit") AuditData audit);

       void updateForecast(@Param("forecast") Forecast forecast, @Param("deleted") boolean deleted, @Param("audit") AuditData audit);

       @Flush

       List flush();

   }

添加了flush方法,是为了控制批量插入的大小。返回值是影响的行数。


service中的用法


   @Autowired

   @Qualifier(BatchConfiguration.BATCH_FORECAST_MAPPER)

   private ForecastMapper batchForecastMapper;

   ...

   if (!toUpdate.isEmpty()) {

       for (ForecastUpdate forecast : toUpdate) {

           batchForecastMapper.updateForecast(forecast, forecast.isDeleted(), auditData);

       }

       batchForecastMapper.flush();

   }

   for (ForecastUpdate forecast : toCreate) {

       batchForecastMapper.createForecast(forecast, auditData);

       // Oracle does not support useGeneratedKeys in batch update, but flush after each statement works.

       batchForecastMapper.flush();

   }

调用flush时会调用doFlushStatement方法把数据批量刷新到表中。另外flush方法在每个事务结束前或者select语句调用前会自动触发。


潜在的问题:


Oracle 数据库中需要每个插入语句后都要调用flush方法,来使得useGeneratedKeys生效。



参考文章:  Mybatis Executor原理分析



 

————————————————

版权声明:本文为CSDN博主「明明如月学长」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w605283073/article/details/88652042

相关文章
|
SQL XML 安全
mybatis批量更新数据三种方法效率对比【Mysql】
mybatis批量更新数据三种方法效率对比【Mysql】
3587 0
mybatis批量更新数据三种方法效率对比【Mysql】
|
7月前
|
SQL Java 数据库连接
MyBatis SQL 批量更新(代码➕案例)
MyBatis SQL 批量更新(代码➕案例)
965 0
|
8月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
96 0
|
Oracle 关系型数据库 MySQL
mybatis执行批量更新batch update 的方法(oracle,mysql)
mybatis执行批量更新batch update 的方法(oracle,mysql)
1323 0
|
Java 关系型数据库 MySQL
SSM Mybatis 中传入List实现 批量插入、批量更新、批量删除
SSM Mybatis 中传入List实现 批量插入、批量更新、批量删除
925 0
|
SQL Java 数据库连接
Mybatis批量更新,批量删除
Mybatis批量更新,批量删除
1673 0
|
SQL 关系型数据库 MySQL
Mybatis批量更新出现BadSqlGrammarException异常解决
解决mybatis批量更新出现异常解决方案
3247 0
|
Java 数据库连接 mybatis
mybatis的批量更新实例
近来批量添加,删除,更新用的比较多,单一的删除和更新,操作无法满足企业某些业务的需求,故通过以下示例分享知识: 今天通过更新的例子来说明 演示环境为jdk8,maven环境,ssm框架 请准备好环境,数据表可直接使用 一、准备数据表 CREATE TABLE `user` ( `user_id...
1896 0
|
关系型数据库 Java 数据库连接
用mybatis批量更新数据报错问题
url: jdbc:mysql://123.xx7.139.126:3306/answer?characterEncoding=UTF8&useSSL=true 给这个url后面添加&allowMultiQueries=true 意思是允许多条数据...
2104 0
|
SQL Java 数据库连接
Mybatis的Executor介绍(二)——批处理,批量更新
6       Mybatis的Executor介绍(二)——批处理        在程序中,有时候我们需要批量的去操作一些数据,批量的新增、修改、删除,如果是通过for循环一条记录一条记录的去更新无疑效率会比较慢。
2016 0