mybatis批量提交

Posted 叶枫声

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis批量提交相关的知识,希望对你有一定的参考价值。

之前在做项目时,使用mybatis,批量执行sql,这里简单写下步骤

  • 在配置数据库连接时,加入一个参数,例如

 

jdbc:mysql://127.0.0.1:3307/mvs-report?allowMultiQueries=true

 

  • 在mybatis执行时传入list集合参数,
  • 在mybatis的xml文件中拼装sql,例如
<insert id="batchInsert" parameterType="java.util.List" >
    insert into rpt_fault (FAULT_ID, FAULT_NAME)
    values 
    <foreach collection="list" item="item" separator=",">
        (#{item.faultId,jdbcType=INTEGER}, #{item.faultName,jdbcType=VARCHAR})
    </foreach>
  </insert>
  • 一般来说这就满足需求了,但是为了更好的扩展,最好是指定一个集合最大值,这样一来方便在不同配置的服务器上切换,手动调节阈值。本示例使用了java反射特性来实现,具体如下
     1     private static final int ADD_MAX = 200;
     2     private static final int DELETE_MAX = 500;
     3     public static void executeBatchAdd(Object mapper, List<?> list) throws Exception {
     4         if (Objects.isNull(list) || list.isEmpty())
     5             return;
     6 
     7         try {
     8             Method method = mapper.getClass().getMethod("batchInsert", List.class);
     9             int size = list.size();
    10             if (size > ADD_MAX) {
    11                 int num = (size) / ADD_MAX + 1;
    12                 int start = 0, end = 0;
    13                 for (int i = 1; i <= num; i++) {
    14                     start = (i - 1) * ADD_MAX;
    15                     end = (i * ADD_MAX) > size ? size : (i * ADD_MAX);
    16                     method.invoke(mapper, list.subList(start, end));
    17                 }
    18             } else
    19                 method.invoke(mapper, list);
    20         } catch (Exception e) {
    21             logger.error("批量插入任务执行失败:", e.getMessage(), e);
    22             throw e;
    23         } finally {
    24             list.clear();
    25         }
    26     }

     

以上是关于mybatis批量提交的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 的批量处理功能

mybatis使用的一点小结:session运行模式及批量提交(转)

MySQLのmybatis批量插入数据

那些年我们爬过的山 - mybatis批量导入

mybatis怎么实现批量查询

MyBatis批量插入的五种方式归纳总结