之前在做项目时,使用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反射特性来实现,具体如下

         private static final int ADD_MAX = 200;
    private static final int DELETE_MAX = 500;
    public static void executeBatchAdd(Object mapper, List<?> list) throws Exception {
    if (Objects.isNull(list) || list.isEmpty())
    return; try {
    Method method = mapper.getClass().getMethod("batchInsert", List.class);
    int size = list.size();
    if (size > ADD_MAX) {
    int num = (size) / ADD_MAX + 1;
    int start = 0, end = 0;
    for (int i = 1; i <= num; i++) {
    start = (i - 1) * ADD_MAX;
    end = (i * ADD_MAX) > size ? size : (i * ADD_MAX);
    method.invoke(mapper, list.subList(start, end));
    }
    } else
    method.invoke(mapper, list);
    } catch (Exception e) {
    logger.error("批量插入任务执行失败:", e.getMessage(), e);
    throw e;
    } finally {
    list.clear();
    }
    }

    最后补充:

  • 有时候我们在使用mysql数据库时候,当我们的阈值过大时,可能会遇到过more than 'max_binlog_cache_size' bytes of storage 的错误
  • 这是不要慌,这是mysql默认的日志提交字节太小导致的。
  • 首先查看当前设置的大小:show variables like '%binlog_%size%';
  • 然后酌情设置set global max_binlog_cache_size=10737418240;
  • 此种方式不用重启数据库服务器,较为简便。

mybatis批量提交的更多相关文章

  1. MyBatis 通过 BATCH 批量提交

    本文由 简悦 SimpRead 转码, 原文地址 https://www.jb51.net/article/153382.htm 很多人在用 MyBatis 或者 通用 Mapper 时,经常会问有没 ...

  2. springMVC 接收数组参数,mybatis 接收数组参数,mybatis批量插入/批量删除案例

    案例是给一个用户赋予多个权限,多个权限用其对应的主键 id 为参数,组成了 一个id数组,传给springMVC,然后springMVC传给mybatis,然后mybatis批量插入.其实类似的场景还 ...

  3. Mybatis批量insert报错的解决办法【the right syntax to use near '' at line...】

    Java中使用Mybatis批量插入数据时Mapper.xml中的sql如下: <insert id="batchSave"> into t_emp(emp_name, ...

  4. Mybatis 批量插入

    一.首先对于批量数据的插入有两种解决方案(下面内容只讨论和Mysql交互的情况) 1)for循环调用Dao中的单条插入方法 2)传一个List<Object>参数,使用Mybatis的批量 ...

  5. mybatis批量插入数据到oracle

    mybatis 批量插入数据到oracle报 ”java.sql.SQLException: ORA-00933: SQL 命令未正确结束“  错误解决方法 oracle批量插入使用 insert a ...

  6. myBatis批量查询操作,xml中使用foreach案例

    使用场景:有一个订单表,实体类为OrderBase.java,订单有个状态为status值可能为"1,2,3,4,5,6",现在需要查询状态为"2,3,4"的订 ...

  7. php中bindValue的批量提交sql语句

    php预编译sql语句,可以批量提交sql,也可以实现防注入 <?php $dsn='mysql:host=127.0.0.1;port=3306;dbname=bisai'; $usernam ...

  8. js 批量提交数据

    // 批量提交数据 let pageSize = 100, total = dataTmp.length, list = dataTmp let totalPage = Math.ceil(total ...

  9. mybatis批量更新报错badsql

    mybatis批量更新时语法写的都对,但是报错,需要在连接上面加上allowMultiQueries=true 示例:jdbc:MySQL://192.168.1.236:3306/test?useU ...

随机推荐

  1. ubuntu下ruby文件执行蛋疼的一个问题

    ubuntu下面用sublime打开非常简单的一段代码(其实不算代码,因为没有实际语句): #!/usr/bin/ruby 在shell下加入x权限:chmod u+x doit.rb,然后运行 ./ ...

  2. Mac Finder 里新建文本

    Mac Finder 里新建文本 首先吐槽下 Mac 的文件管理 Finder 真的是太弱了,之前没感觉 Windows 的资源管理器多厉害,但是和 Mac 的比起来真是堪称神器啊,果然牛逼与否还的看 ...

  3. partition List(划分链表)

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  4. JAVA堆栈的区别

    1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.              2. 栈的优势是,存取速度 ...

  5. java并发包小结(二)

    接上一篇 java并发包小结(一):http://blog.csdn.net/aalansehaiyang52/article/details/8877579 Future 接口Future 接口允许 ...

  6. JS(API-日期和math)

    JS(日期和math) 问题1.获取 2017-06-10 结果: 1.dt.getMonth() + 1 是真实的月份 2.month = '0' + month 中,month 是数字(numbe ...

  7. saltstack安装部署以及简单实用

    一,saltstack简介:     SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位. SaltSta ...

  8. python3学习笔记2---引用http://python3-cookbook.readthedocs.io/zh_CN/latest/2

    2018-03-01数据结构和算法(2) 1.6字典中的键映射多个值 一个字典就是一个键对应一个单值的映射.如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面. ...

  9. visual studio中如何将string类型值转为BYTE(unsigned char)类型

    昨天困惑一件事,就是手里有个string类型的字符串,像01 23 45 67 89 AB CD EF,根据空格拆分为一个个的子字符串后(如EF),需要放到一个BYTE(typedef unsigne ...

  10. Java核心卷笔记(一)

    第三章Java基程序设计结构 1.注释 三种注释方式: // 注释单行 /* 内容 */ 注释单行 /** * 内容 */ 2. java 数据类型 Java数据类型可分为两种:基本数据类型和引用数据 ...