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批量提交的主要内容,如果未能解决你的问题,请参考以下文章