精华内容
下载资源
问答
  • Mybatis批量操作推荐 Mybatisplus真假批量操作 第一篇、Mybatis批量操作推荐 在工作中使用mybatis操作mysql的时候,难免会有些批量更新或批量插入操作,此时应该启用mybatis的批量查询功能,即设置 ...

    目录

    Mybatis批量操作推荐

    Mybatisplus真假批量操作


    第一篇、MyBatis批量操作推荐

    在工作中使用mybatis操作mysql的时候,难免会有些批量更新或批量插入操作,此时应该启用mybatis的批量查询功能,即设置

    allowMultiQueries=true,以及配合mybatis的<foreach></foreach>标签完成批量操作。

    例如,在执行批量操作前,先设置配置文件中mysql的连接属性(allowMultiQueries=true):

    spring: 
        datasource:
            url: jdbc:mysql://localhost:3306/database_name?characterEncoding=utf8&useSSL=false&allowMultiQueries=true
            username: root
            password: 123456
            driverClassName: com.mysql.jdbc.Driver
            type: com.zaxxer.hikari.HikariDataSource
            hikari:
                minimum-idle: 100
                maximum-pool-size: 100
                max-lifetime: 1800000
                idle-timeout: 600000
                connection-timeout: 30000
                connection-test-query: SELECT 1
                data-source-properties:
                    cachePrepStmts: true
                    prepStmtCacheSize: 250
                    prepStmtCacheSqlLimit: 2048

    然后,在批量更新操作中,使用如下SQL:

    <update id="updateDataByBatch" parameterType = "java.util.List">
            <foreach collection="list" index="index" item="item" open="" close=";" separator=";">
                UPDATE user_info
                SET
                name= #{item.name},
                password= #{item.password}
                WHERE id = #{item.id}
            </foreach>
    </update>

    在批量插入操作中,使用如下SQL:

    <insert id="insertDataByBatch" parameterType = "java.util.List">
    	INSERT INTO user_info (name, password)
    	VALUES
    	<foreach collection="list" index="index" item="item" separator=",">
    		(#{item.name}, #{item.password})
    	</foreach>
    </insert>

    第二篇、Mybatisplus真假批量操作

    有些同学在mysql的批量操作中,可能还使用了mybatisplus插件提供的api来完成批量操作,分析过源码的同学应该会发现,虽然这些批量操作确实很方便我们的实现,但它是一个伪的“批量操作”,因为底层的实现还是调用的mybatis的单条操作来实现的,因此效率并不高,如insertBatchinsertOrUpdateBatch updateBatchById 等,我们来看看其中insertBatch的部分源码:

    这是IService接口中批量插入的定义:

    /**
     * <p>
     * 插入(批量),该方法不适合 Oracle
     * </p>
     *
     * @param entityList
     *            实体对象列表
     * @return boolean
     */
    boolean insertBatch(List<T> entityList);

    这是ServiceImpl实现类中批量插入的具体实现:

    public boolean insertBatch(List<T> entityList) {
    	return insertBatch(entityList, 30);
    }
    
    ...
    
    /**
     * 批量插入
     *
     * @param entityList
     * @param batchSize
     * @return
     */
    public boolean insertBatch(List<T> entityList, int batchSize) {
    	if (CollectionUtils.isEmpty(entityList)) {
    		throw new IllegalArgumentException("Error: entityList must not be empty");
    	}
    	SqlSession batchSqlSession = sqlSessionBatch();
    	try {
    		int size = entityList.size();
    		for (int i = 0; i < size; i++) {
                // 此次调用的单条insert方法 
    			baseMapper.insert(entityList.get(i));
    			if (i % batchSize == 0) {
    				batchSqlSession.flushStatements();
    			}
    		}
    		batchSqlSession.flushStatements();
    	} catch (Exception e) {
    		logger.warn("Error: Cannot execute insertBatch Method. Cause:" + e);
    		return false;
    	}
    	return true;
    
    }
    

    从上面的源码可以看出,mybatisplus插件提供的批量操作其实并不是真正意义上的批处理操作,至少在2.0版本以内不是,其他批量操作也是一样的,我这里就不做赘述了,有兴趣的同学,可以自己去分析源码,并避免使用这些假的“批量操作”。

    展开全文
  • RedisTemplate批量操作教程,利用pipeline批量操作;multiSet()批量操作;for循环批量操作 的性能对比 一.使用pipeline的好处 了解redis的小伙伴都知道,redis是一个高性能的单线程的key-value数据库。它的执行过程...

    作者:施自扬
    微信号:shiziyangwx

    RedisTemplate批量添加操作教程,利用pipeline批量操作;multiSet()批量操作;for循环批量操作 的性能对比

    一.使用pipeline的好处

    了解redis的小伙伴都知道,redis是一个高性能的单线程的key-value数据库。它的执行过程为:

    (1)发送命令-〉(2)命令排队-〉(3)命令执行-〉(4)返回结果

    如果我们使用redis进行批量插入数据,正常情况下相当于将以上四个步骤批量执行N次。(1)和(4)称为Round Trip Time(RTT,往返时间)。在一条简单指令中,往往(1)(4)步骤之和大过于(2)(3)步骤之和,如何进行优化?Redis提供了pipeline管道机制,它能将一组Redis命令进行组装,通过一次RTT传输给Redis,并将这组Redis命令的执行结果按顺序返回给客户端。

    优缺点总结:
    1.性能对比:multiSet()>pipeline管道>普通for循环set
    2.扩展性强,可以支持设置失效时间。multiSet()不支持失效时间的设置

    二、批量操作的工具类

    package com.demo.util;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.dao.DataAccessException;
    import org.springframework.data.redis.connection.RedisConnection;
    import org.springframework.data.redis.connection.RedisStringCommands;
    import org.springframework.data.redis.core.RedisCallback;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.types.Expiration;
    import org.springframework.data.redis.serializer.RedisSerializer;
    import org.springframework.stereotype.Component;
    
    import java.util.List;
    import java.util.Map;
    
    @Component
    public class BatchRunRedisUtil {
        @Autowired
        private RedisTemplate<String, Object> stringRedisTemplate;
    
        //批量添加
        public void batchSet(Map<String, String> map) {
            stringRedisTemplate.opsForValue().multiSet(map);
        }
    
        //批量添加 并且设置失效时间
        public void batchSetOrExpire(Map<String, String> map, Long seconds) {
            RedisSerializer<String> serializer = stringRedisTemplate.getStringSerializer();
            stringRedisTemplate.executePipelined(new RedisCallback<String>() {
                @Override
                public String doInRedis(RedisConnection connection) throws DataAccessException {
                    map.forEach((key, value) -> {
                        connection.set(serializer.serialize(key), serializer.serialize(value), Expiration.seconds(seconds), RedisStringCommands.SetOption.UPSERT);
                    });
                    return null;
                }
            }, serializer);
        }
    
        //批量获取
        public List<Object> batchGet(List<String> list) {
            List<Object> objectList = stringRedisTemplate.opsForValue().multiGet(list);
            return objectList;
        }
    
        // Redis批量Delete
        public void batchDelete(List<String> list) {
            stringRedisTemplate.delete(list);
        }
    
    }
    

    三.性能测试

    通过for循环来向redis插入数据,通过pipeline插入数据,通过使用redisTemplate.opsForValue().multiSet(map)插入数据查看执行时间。

    演示代码

    package com.demo;
    
    import com.demo.util.BatchRunRedisUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.data.redis.core.RedisTemplate;
    
    import java.util.HashMap;
    import java.util.Map;
    
    @SpringBootApplication
    public class DemoApplication implements CommandLineRunner {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Autowired
        private RedisTemplate<String, Object> stringRedisTemplate;
    
        @Autowired
        private BatchRunRedisUtil batchRunRedisUtil;
    
        @Override
        public void run(String... args) throws Exception {
        	//for循环批量添加
            long startTime = System.currentTimeMillis();
            for (int i = 0; i < 100000; i++) {
                stringRedisTemplate.opsForValue().set("aaa" + i, "a", 60);
            }
            long endTime = System.currentTimeMillis();
            System.out.println("普通set消耗" + (endTime - startTime) + "毫秒");
    		//利用pipeline批量操作
            long startTime2 = System.currentTimeMillis();
            Map map = new HashMap(100000);
            for (int i = 0; i < 100000; i++) {
                map.put("bbb" + i, "b");
            }
            batchRunRedisUtil.batchSetOrExpire(map, 60l);
            long endTime2 = System.currentTimeMillis();
            System.out.println("管道set消耗" + (endTime2 - startTime2) + "毫秒");
    		//multiSet()批量操作
            long startTime3 = System.currentTimeMillis();
            Map map2 = new HashMap(100000);
            for (int i = 0; i < 100000; i++) {
                map2.put("ccc" + i, "b");
            }
            batchRunRedisUtil.batchSet(map2);
            long endTime3 = System.currentTimeMillis();
            System.out.println("批量set消耗" + (endTime3 - startTime3) + "毫秒");
        }
    
    }
    

    在本机分别执行了三次结果:

    普通set消耗9010毫秒
    管道set消耗1606毫秒
    批量set消耗18毫秒

    普通set消耗8228毫秒
    管道set消耗1059毫秒
    批量set消耗14毫秒

    普通set消耗8365毫秒
    管道set消耗1092毫秒
    批量set消耗13毫秒

    通过比较发现,逐条执行时间是pipeline执行平均时间的8倍!这是在本机测试的结果,理论上,客户端与服务端的网络延迟越大,性能体能越明显。
    当然,pipeline性能提升虽然明显,但是每次管道里命令个数太多的话,也会造成客户端响应时间变久,网络传输阻塞。最好还是根据业务情况,将大的pipeline拆分成多个小的pipeline来执行。
    如果不用设置失效时间的话最好使用redisTemplate.opsForValue().multiSet(map)方法来添加

    展开全文
  • Mybatis批量操作

    万次阅读 2017-09-08 11:37:38
    Mybatis常会出现批量操作,如批量查询,批量插入,批量修改(replace into)。批量操作要比循环执行效率提升很多,这里对mybatis的批量操作做一个总结讲解。 Foreach foreach:foreach的主要用在构建in条件中,它可以...

    Mybatis常会出现批量操作,如批量查询,批量插入,批量修改(replace into)。批量操作要比循环执行效率提升很多,这里对mybatis的批量操作做一个总结讲解。

    Foreach

    foreach:foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。它是批量操作的核心标签,下面都是foreach在不同场景的应用和写法。

    List<String>

    select id, accid, key1, key1createtime key1CreateTime, key2, key2createtime key2CreateTime
            from m_acc_keys where accid in
    <foreach item="item" index="index" collection="paramIds" open="(" separator="," close=")">
           #{item}
    </foreach>

    注意:你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list”作为键,而数组实例将会以“array”作为键。

    List<Object>

    这是一个批量保存(插入或修改)的例子

    <insert id="insertList" parameterType="list" >
        replace into xx (id, c1,c2) values
        <foreach collection="list" item="it" separator=",">
            (#{it.id},#{it.c1},#{it.c2})
        </foreach>
    </insert>

    replace:会根据主键和唯一索引判断该记录是否存在,存在就删除在插入(修改),不存在就插入(insert)。

    数组

    还是一个查询的例子

    public List<Column> selectByIds(String[] ids); 
    <select id="selectByIds" parameterType="java.lang.String" 
    	resultType="columnMap">
    	<include refid="select_clause"></include>
    	where c.id in 
    	<foreach collection="array" item="id" open="(" separator="," close=")">
               #{id}
           </foreach>
    </select>

    多重循环

    colids和proids是两个平级的数据。

    <delete id="move" parameterType="java.util.Map">
    	insert into b_column_programme(columnId, programmeId) 
    	values 
          	<foreach collection="colids" item="colid" separator="," >
               <foreach collection="proids" item="proid" separator="," >
                (#{colid}, #{proid})
            </foreach>
           </foreach>
    </delete>

    批量插入id自增长

    Mybatis在版本3.4.x以上支持批量插入绑定自增长id,常用版本3.4.1。

    对应的maven支持

    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>1.3.1</version>
    </dependency>

    Mapper.xml写法

    <insert id="insertList" parameterType="list" useGeneratedKeys="true" keyProperty="id" >
        insert into xx
        (c1,c2)
        values
        <foreach collection="list" item="it" separator=",">
            (#{it.c1},#{it.c2})
        </foreach>
    </insert>
    展开全文
  • mysql按日期批量操作(临时笔记)

    万次阅读 2021-01-20 18:27:50
    CREATE DEFINER=`root`@`%` PROCEDURE `export_current_data`() BEGIN DECLARE t1 datetime DEFAULT '2020-12-19' ; DECLARE t2 datetime DEFAULT '2021-01-20' ; WHILE t1 < t2 DO ... INSERT IGNORE INTO sl...
    CREATE DEFINER=`root`@`%` PROCEDURE `export_current_data`()
    BEGIN
       
     DECLARE t1 datetime DEFAULT '2020-12-19' ;
     DECLARE t2 datetime DEFAULT '2021-01-20' ;
    
     WHILE t1 < t2 DO
    
      INSERT IGNORE INTO sl_current ( `pro_id`, `time`, `location`, `keyword_id`, `ad_push`)(
       SELECT
        `pro_id`,  `time`,  `location`,  `keyword_id`,  `ad_push`
       FROM
        sl_current_bak
       WHERE
        id IN (
         SELECT      max(id) AS id     FROM      sl_current_bak
         WHERE      time >= t1   AND  time < TIMESTAMPADD(DAY,1,t1) 
         GROUP BY      pro_id,    keyword_id
        )
      ) ; 
    
      SET t1 = TIMESTAMPADD(DAY,1,t1) ; 
    
     END WHILE;
    
    END
    
    展开全文
  • Mybatis 批量操作8种实现总结

    万次阅读 多人点赞 2018-12-09 15:57:53
    Mybatis 批量操作8种实现总结超全带实例
  • tmux 批量操作

    千次阅读 2017-02-02 14:32:55
    可以用tmux的分屏和批量操作来解决这个问题。tmux安装:略tmux的分屏操作:tmux的命令都是ctrl+b开始的ctrl+b 再按" :垂直分割 ctrl+b 再按% :水平分割 如果你有8台机器需要执行相同操作,那么分出8个窗口来即可。 ...
  • Elasticsearch的批量操作

    千次阅读 2019-03-08 14:16:58
    Elasticsearch的批量操作 Elasticssearch提供批量操作(插入,更新,删除),批量操作的API是_bulk,此功能非常强大,因为它提供了一种非常有效的机制,可以尽可能快地进行多个操作,并尽可能少地进行网络往返。 批量...
  • MyBatis批量操作

    千次阅读 2013-08-30 14:32:14
    这篇博客介绍了批量插入的几种方式:simple方式(基本数据库逐条访问)、batch方式(批量操作)、procedure方式(存储过程) 并且通过测试,说明了他们的效率 MyBatis的关于批量数据操作的体会 这篇博客介绍...
  • linux批量操作工具

    千次阅读 2018-02-09 23:52:14
    轻量级批量操作工具 欢迎下载体验 batchTools batchTools_update 目的 轻量级批量操作工具是一款自动化运维工具,基于java开发的,主要实现批量系统配置、批量程序部署、批量运行命令等功能。 背景 为了提高...
  • 数据库的批量操作

    千次阅读 2020-12-26 00:00:36
    接下来,我们来对数据库的数据进行一个批量操作,完成批量的添加和修改! 实现其实也是非常简单的,主要是用到Mybatis的动态sql。众所周知,MyBatis一个强大的特性之一通常是它的动态 SQL 能力。那现在我们就用这个...
  • 数据库的批量操作 为了尽可能提高我们的sql执行效率,一般我们针对多条数据的操作,使用批量更新或者批量插入的方式 方式如下: --批量插入 &amp;lt;insert id=&quot;saveUserList&quot; ...
  • Redis集群批量操作

    千次阅读 2018-07-23 17:32:22
    众所周知,Redis集群是没法执行批量操作命令的,如mget,pipeline等。这是因为redis将集群划分为16383个哈希槽,不同的key会划分到不同的槽中。但是,Jedis客户端提供了计算key的slot方法,已经slot和节点之间的映射...
  • Mysql的批量操作(批量查询)

    万次阅读 2017-11-28 22:39:09
    前面几篇Mysql的文章一直在写普通查询,从这篇开始,会写一些Mysql的批量操作。 本篇主要是mysql的批量查询,主要是通过id来查询,如果需要查询多个id对应的多个数据,使用for循环去查,对程序来说不太高效。在这里...
  • 批量操作,批量删除 或者修改

    千次阅读 2018-01-16 19:58:27
    批量操作 两个方法 : 一 :在控制层 批量操作 : 前端按钮获取 id数组 : 后台通过 String[] id 获取到id数组 ,然后遍历数组 在 循环遍历的时候进行 修改或者删除操作 : 例如 : 批量删除 @RequestMapping("/...
  • Android数据库批量操作

    千次阅读 2017-10-09 11:24:40
    ​ Android 数据库批量操作为了方便数据库的批量更新、删除、插入操作,android系统引入了ContentProviderOperation类。使用这个类具有以下优点:1.数据完整性,即所有的操作都在一个事务中执行。2.由于批量操作在一...
  • SpringBoot JdbcTemplate批量操作

    千次阅读 2019-05-15 13:25:50
    前言 在我们做后端服务Dao层开发,特别是大数据批量插入的时候,这时候普通的ORM框架(Mybatis、...综合考虑我们使用Spring中的JdbcTemplate和具名参数namedParameterJdbcTemplate来进行批量操作。 改造前 在开...
  • Python 批量操作文件,批量解压缩

    千次阅读 2019-08-08 17:53:41
    # 批量操作文件,批量解压缩 import os import shutil import rarfile import re def main(target_path): # print(os.listdir(target_path)) for root, dirs, files in os.walk(target_path): now_dir = root ....
  • JDBC批量操作

    千次阅读 2011-11-17 22:38:10
    通过将这些更新操作封装到一个批量操作中,可以大量减少与数据库的操作频繁度。 本章节将详细描述使用JdbcTemplate或者SimpleJdbcTemplate进行批量操作的流程。   1、使用JdbcTemplate进行批量操作 ...
  • 【EasyUI DataGrid】批量操作

    千次阅读 2018-07-30 15:02:06
    一、EasyUI批量操作样式 为了能够对EasyUI中的多行数据进行操作,需添加复选框。如下图所示: EasyUI中的DataGrid的复选框代码如下所示: &amp;amp;lt;table id=&amp;quot;ddg1&amp;quot; class=&...
  • 交换机端口批量操作

    千次阅读 2019-03-25 21:55:00
    一、交换机端口批量操作 问题描述 S系列交换机版本V200R001C00。 在一台交换机上创建多个VLAN,将不同端口指定到不同的VLAN,然后使用一个Trunk口上行是很典型的企业应用场景。为方便说明问题,我们假设:一台...
  • ssm框架-批量操作

    千次阅读 2018-07-08 19:56:43
    一、实现全选/全部不选的功能 首先对于批量操作,在我们的学习和工作中是非常常见的,因为经常使用,所以总结一下。 如何达到如下效果? 首先看一下表单中的checkbox: 数据遍历:(checkbox可以使用class、name...
  • Linux下批量操作服务器方法

    千次阅读 2017-12-04 15:05:34
    如果需要在大量的服务器执行相同的操作,或者是部署分布式应用(elk, k8s, geth等)时,一般的做法是写一个批量操作的本地脚本,依次scp到每一台服务器上,然后ssh到每一台服务器上执行脚本。但如果有上几十台甚至上...
  • Spring JDBC 常用批量操作及插入操作

    千次阅读 2016-12-16 13:18:58
    Spring 常用批量操作有很多种方法,但是大多数人知道一种或者其中的几种,先总结一些spring JDBC常用的批量操作的方法及其效率; 使用JDBCTemplate 进行基本的批量操作 这种方法是网上大多数采用的方法, ...
  • mybatis批量操作出现BadSqlGrammarException

    千次阅读 2018-08-21 16:31:26
    用过mybatis的猿友也许使用过它的批量操作(可以参考菜鸟程序猿之mybatis的批量操作),但是其实这个地方有个比较坑爹的问题,如下: 这里为我的映射文件对应的sql <update id="testBatchUpd" parameterType=...
  • ContentProviders 是Android 系统核心组件之一,ContentProviders 封装了数据的访问接口,其底层数据一般都是保存在数据库...有时候你需要更新多行数据,可以选择调用多次ContentResolver的对应函数,或者 使用批量操作
  • 页面实现全选和批量操作

    千次阅读 2016-01-23 17:17:35
    全选的思路是:遍历标签下的...批量操作的思路是:用js获取记录中的id用逗号拼接,传到后台执行批量操作的处理 全选js: $("#checkAll").click(function() { var rows = $("#content").find('input'); ...
  • es bulk 批量操作

    万次阅读 2017-03-30 11:41:49
    使用bulk命令时,REST API以_bulk结尾,批量操作写在json文件中,官网给出的语法格式: action_and_meta_data\n optional_source\n action_and_meta_data\n optional_source\n .... action_and_meta_data\n optional...
  • MongoDB 通过 Java 代码 批量操作

    千次阅读 2018-09-17 17:00:01
    MongoDB提供了一种称为 BulkWrite(块)操作方式,数据不会被立即被持久化到数据库中,而是等待程序调度,确定合适的时间持久化到数据库中,其实就是批量操作。 API :com.mongodb.client.MongoCollect...
  • MyBatis批量操作_ORACLE

    万次阅读 2016-04-09 15:08:13
    阅读前,请先阅读MyBatis批量操作_MySql jdbc.properties jdbc.driverClassName=oracle.jdbc.driver.OracleDriver jdbc.url=jdbc:oracle:thin:@//127.0.0.1:1521/orcl jdbc.username=mybatis jdbc.password=...
  • SQL随机数和批量操作

    千次阅读 2016-02-25 17:30:57
    随机数与批量操作

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 414,633
精华内容 165,853
关键字:

批量操作