合理的使用批量插入、更新对性能优化有很大的作用,速度明显快了N倍。

        要注意数据库连接串后面要新增:&allowMultiQueries=true,表示一个sql可以通过分号分割为多个独立sql。

        批量插入的最大限制主要是看你整条sql的长度大小,所以可以根据自身sql长度的大小来配置这个要分批的每批的个数。

批量插入

Dao
1
2
3
public Integer saveStudents(List<Student> students) {
        return super.getSqlSession().insert("StudentMapper.insertStudents", students);
    }
Mapper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<insert id="insertStudents" parameterType="java.util.List">
    insert into t_student(
        city_id
    )
    values
    <foreach collection="list" item="itm" index="index" separator=",">
        (
        #{itm.city_id}
        )
    </foreach>
</insert>

批量更新

Dao
1
2
3
public Integer updateStudents(List<Student> students) {
    return super.getSqlSession().update("StudentMapper.updateStudents", students);
}
Mapper
1
2
3
4
5
6
7
8
9
10
11
12
13
<update id="updateStudents" parameterType="java.util.List">
    <foreach collection="list" item="item" index="index" open=""
        close="" separator=";">
        UPDATE t_studnet
        <set>
            <if test="item.name != null">
                name= #{item.name}
            </if>
        </set>
        WHERE id = #{item.id}
        AND age = #{item.age}
    </foreach>
</update>

List分批的工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * 分批list
 
 * @param sourceList
 *            要分批的list
 * @param batchCount
 *            每批list的个数
 * @return List<List<Object>>
 */
public static List<List<?>> batchList(List<?> sourceList, int batchCount) {
    List<List<?>> returnList = new ArrayList<>();
    int startIndex = 0// 从第0个下标开始
    while (startIndex < sourceList.size()) {
        int endIndex = 0;
        if (sourceList.size() - batchCount < startIndex) {
            endIndex = sourceList.size();
        else {
            endIndex = startIndex + batchCount;
        }
        returnList.add(sourceList.subList(startIndex, endIndex));
        startIndex = startIndex + batchCount; // 下一批
    }
    return returnList;
}


Mybatis 批量插入、批量更新的更多相关文章

  1. mybatis 注解的方式批量插入,更新数据

    一,当向数据表中插入一条数据时,一般先检查该数据是否已经存在,如果存在更新,不存在则新增  使用关键字  ON DUPLICATE KEY UPDATE zk_device_id为主键 model  ...

  2. mybatis中批量插入以及更新

    1:批量插入 批量插入就是在预编译的时候,将代码进行拼接,然后在数据库执行 <insert id="batchInsert" parameterType="java ...

  3. java批量插入或更新的问题

    在批量插入或者更新中,setXXX的时候字段类型必须一致.例如:在普通sql中 pstmt8.setBigDecimal(j ,xxx);可以写成pstmt8.setString(j,xxx.toSt ...

  4. C#使用SqlDataAdapter 实现数据的批量插入和更新

    近日由于项目要求在需要实现中型数据的批量插入和更新,晚上无聊,在网上看到看到这样的一个实现方法,特摘抄过来,以便以后可能用到参考. 一.数据的插入 DateTime begin = DateTime. ...

  5. MySQL on duplicate key update 批量插入并更新已存在数据

    业务上经常存在一种现象,需要批量往表中插入多条数据,但在执行过程中,很可能因为唯一键冲突,而导致批量插入失败.因此需要事先判断哪些数据是重复的,哪些是新增的.比较常用的处理方法就是找出已存在的数据,并 ...

  6. Mybatis中实现oracle的批量插入、更新

    oracle 实现在Mybatis中批量插入,下面测试可以使用,在批量插入中不能使用insert 标签,只能使用select标签进行批量插入,否则会提示错误 ### Cause: java.sql.S ...

  7. 【mybatis】mybatis中批量插入 批量更新 batch 进行insert 和 update,或者切割LIst进行批量操作

    ================================================================== 分别展示 mybatis 批量新增  和 批量更新   的操作: ...

  8. Mybatis 批量插入和更新小例

    SpringBoot配置Mybatis前文有博文,数据库mysql: package com.example.demo.biz.dto; public class User { private int ...

  9. MyBatis动态批量插入、更新Mysql数据库的通用实现方案

    一.业务背景 由于需要从A数据库提取大量数据同步到B系统,采用了tomikos+jta进行分布式事务管理,先将系统数据源切换到数据提供方,将需要同步的数据查询出来,然后再将系统数据源切换到数据接收方, ...

  10. Oracle+Mybatis批量插入,更新和删除

    1.插入 (1)第一种方式:利用<foreach>标签,将入参的list集合通过UNION ALL生成虚拟数据,从而实现批量插入(验证过) <insert id="inse ...

随机推荐

  1. [python]_ELVE_pip2和pip3如何共存

    作者:匿名用户链接:https://www.zhihu.com/question/21653286/answer/95532074来源:知乎著作权归作者所有,转载请联系作者获得授权. 想学习Pytho ...

  2. Spring boot 整合 Mybatis (完整版)

    最近工作上时间有点多,然后自己就学习了一下Spring boot,外加上Mybatis,在实际开发中都是比较常用的,所以这篇写一下SpringBoot整合Mybatis. 一.数据准备 CREATE ...

  3. javaIO流--Writer,Reader

    Writer /** *<li> Writer中定义的一个重要的方法: * public void writer(String str)throws IOException; */ pac ...

  4. [LeetCode] Binary Number with Alternating Bits 有交替位的二进制数

    Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will a ...

  5. servlet之session设置

    商品对象,购物车对象,servlet的实现 商品: package app02d;public class Product {    private int id;    private String ...

  6. Mac下安装oh-my-zsh

    Mac下自带的终端并不好用,当你打开终端的时候是一个白花花的窗口,其实Mac自带几种shell,默认使用的是bash,可以通过 cat /etc/shells 查看几种shell bin/bash / ...

  7. BZOJ 3938 Robot

    Description 小q有n只机器人,一开始他把机器人放在了一条数轴上,第i只机器人在ai的位置上静止,而自己站在原点.在这 之后小q会执行一些操作,他想要命令一个机器人向左或者向右移动x格.但是 ...

  8. [HNOI2012]双十字

    题目描述 在C 部落,双十字是非常重要的一个部落标志.所谓双十字,如下面两个例子,由两条水平的和一条竖直的”1“线段组成,要求满足以下几个限制: ![] 我们可以找到 5 个满足条件的双十字,分别如下 ...

  9. hihocoder 1391 树状数组

    #1391 : Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, countr ...

  10. 【Toll!Revisited(uva 10537)】

    题目来源:蓝皮书P331 ·这道题使得我们更加深刻的去理解Dijkstra!       在做惯了if(dis[u]+w<dis[v])的普通最短路后,这道选择路径方案不是简单的比大小的题横在了 ...