之前在做项目时,使用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. 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会

    不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...

  2. 使用Interlocked在多线程下进行原子操作,无锁无阻塞的实现线程运行状态判断

    巧妙地使用Interlocked的各个方法,再无锁无阻塞的情况下判断出所有线程的运行完成状态. 昨晚耐着性子看完了clr via c#的第29章<<基元线程同步构造>>,尽管这 ...

  3. mybatis中分页插件PageHelper的使用

    转载博客:http://blog.csdn.net/u012728960/article/details/50791343

  4. ORACLE复杂查询之连接查询

    一.传统的连接查询 1.交叉连接:返回笛卡尔积 WHERE中限定查询条件,可以预先过滤掉掉不符合条件的记录,返回的只是两个表中剩余记录(符合条件的记录)的笛卡尔积. 2.内连接:参与连接的表地位平等, ...

  5. JSPWiki安装配置及FCKEditor的集成

    版本:JSPWiki-2.8.2 FCKeditor_2.6.3     安装方法我参照:http://doc.jspwiki.org/2.4/wiki/InstallingJSPWiki FCKEd ...

  6. C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字

    原文地址:https://blog.csdn.net/shine_journey/article/details/53081523 1.在C++编码过程中,类的创建十分频繁. 简单的功能,当然不用考虑 ...

  7. docker学习笔记(一)—— ubuntu16.04下安装docker

    docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...

  8. c# 事件和EventManager

    事件 基本用法 关键字event,声明格式为: public event <委托类型> <事件对象> 事件的处理方法:适用于该委托的方法 数据的触发: 绑定同类事件,绑定时,可 ...

  9. mapreduce shuffle 和sort 详解

        MapReduce 框架的核心步骤主要分两部分:Map 和Reduce.当你向MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map 任务,然后分配到不同的节点上去执 ...

  10. python while 循环语句

    Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务.其基本形式为: while 判断条件: 执行语句-- 执行语句可以是单个语句或语句 ...