精华内容
下载资源
问答
  • Mybatis批量插入(三)高效插入

    千次阅读 2018-04-08 17:04:39
    为了提高代码的执行效率,我们有时需要采用批量插入的添加方法。 mybatis配置如下: <insert id="insertModelConditionDetailList" parameterType="java.util.List"> insert...

    为了提高代码的执行效率,我们有时需要采用批量插入的添加方法。

    mybatis配置如下:

    <insert id="insertModelConditionDetailList" parameterType="java.util.List">
            insert into `ldp_analy_model_condition_detail` (<include refid="detailSql"></include>)
            values
            <foreach collection="list" item="item" separator=",">
                (#{item.id},#{item.cId},#{item.andOr},#{item.selectName},#{item.operation},
                #{item.referenceValue},#{item.conditionSql},#{item.createBy},#{item.createTime})
            </foreach>
        </insert>

    mapper配置如下:

    public int insertModelConditionDetailList(@Param("list")List<Map<String,Object>> detailList);
    展开全文
  • 只要学我一样编写这么一个工具类便可以实现批量插入多条数据,百条,千条,万条,后期还会继续优化增加数据时的速度!有点代码基础的保证能看懂,此项目已经有了前端界面你可以直接的导入然后运行测试既可以了,表...
  • JDBC之高效批量插入

    2021-11-28 17:09:44
    PreparedStatement支持批量插入,在一次编译的基础上还可以减少IO和写入数据库来提高批量插入的效率。

    前言

    PreparedStatement支持批量插入,在一次编译的基础上还可以减少IO和写入数据库来提高批量插入的效率。

    一、批量插入

    1、批量执行SQL语句

    当需要成批插入或者更新记录时,可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理。通常情况下比单独提交处理更有效率

    JDBC的批量处理语句包括下面三个方法:

    • addBatch(String):添加需要批量处理的SQL语句或是参数;
    • executeBatch():执行批量处理语句;
    • clearBatch():清空缓存的数据

    通常我们会遇到两种批量执行SQL语句的情况:

    • 多条SQL语句的批量处理;
    • 一个SQL语句的批量传参;

    2、批量插入源码

    /**
         * @function 高效批量插入
         * 大批量插入,如何提高效率?
         * 1.减少IO次数,通过Batch来减少IO,
         * mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。
         * ?rewriteBatchedStatements=true 写在配置文件的url后面(5.1.37版本以上才支持)
         * 2.减少写入数据库次数,conn.setAutoCommit(false);
         */
        
        @Test
        public void multiInsert() {
            String sql = "insert into goods(name) values(?)";
            try (Connection conn = getConn();
                 PreparedStatement ps = conn.prepareStatement(sql)) {
                //第一点,减少写入数据库次数,设置非自动提交
                conn.setAutoCommit(false);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i <= 1000000; i++) {
                    sb.append("name");
                    //1.为占位符赋值
                    ps.setObject(1, sb.append(i).toString());
                    sb.delete(0, sb.length());
                    //第二点,通过Batch来减少IO
                    ps.addBatch();//先把SQL存起
                    if (i % 500 == 0) {
                        ps.executeBatch();//执行存起的SQL,减少500-1=499次IO
                        ps.clearBatch();//把batch清空,为下一次装入做准备
                    }
                }
                //写入数据库,一次写入
                conn.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    总结

    1)一次预编译、语法校验及其二进制代码转换。
    2)减少IO次数。
    3)减少数据库写入次数。

    参考文献

    [1] JDBC 尚硅谷

    展开全文
  • 这篇文章主要介绍了mybatis中批量插入的两种方式(高效插入)的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧 MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。...

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。这篇文章主要介绍了mybatis中批量插入的两种方式(高效插入)的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧

    MyBatis简介

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

    一、mybiats foreach标签

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔 符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

    如果传入的是单参数且参数类型是一个List的时候,collection属性值为list

    如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array

    如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了

    具体用法如下:

    <insert id="insertBatch" parameterType="List">
    INSERT INTO TStudent(name,age)
    <foreach collection="list" item="item" index="index" open="("close=")"separator="union all">
    SELECT #{item.name} as a, #{item.age} as b FROM DUAL
    </foreach>
    </insert>

    二、mybatis ExecutorType.BATCH

    Mybatis内置的ExecutorType有3种,默认的是simple,该模式下它为每个语句的执行创建一个新的预处理语句,单条提交sql;而batch模式重复使用已经预处理的语句,并且批量执行所有更新语句,显然batch性能将更优; 但batch模式也有自己的问题,比如在Insert操作时,在事务没有提交之前,是没有办法获取到自增的id,这在某型情形下是不符合业务要求的

    具体用法如下:

    *方式一 spring+mybatis 的

    //获取sqlsession
    //从spring注入原有的sqlSessionTemplate
    @Autowired
    private SqlSessionTemplate sqlSessionTemplate;
    // 新获取一个模式为BATCH,自动提交为false的session
    // 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
    SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
    //通过新的session获取mapper
    fooMapper = session.getMapper(FooMapper.class);
    int size = 10000;
    try{
    for(int i = 0; i < size; i++) {
    Foo foo = new Foo();
    foo.setName(String.valueOf(System.currentTimeMillis()));
    fooMapper.insert(foo);
    if(i % 1000 == 0 || i == size - 1) {
    //手动每1000个一提交,提交后无法回滚 
    session.commit();
    //清理缓存,防止溢出
    session.clearCache();
    }
    }
    } catch (Exception e) {
    //没有提交的数据可以回滚
    session.rollback();
    } finally{
    session.close();
    }
    spring+mybatis

    方法二:

    结合通用mapper sql别名最好是包名+类名

    public void insertBatch(Map<String,Object> paramMap, List<User> list) throws Exception {
    // 新获取一个模式为BATCH,自动提交为false的session
    // 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
    SqlSession session = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH, false);
    try {
    if(null != list || list.size()>0){
    int lsize=list.size();
    for (int i = 0, n=list.size(); i < n; i++) {
    User user= list.get(i);
    user.setIndate((String)paramMap.get("indate"));
    user.setDatadate((String)paramMap.get("dataDate"));//数据归属时间
    //session.insert("com.xx.mapper.UserMapper.insert",user);
    //session.update("com.xx.mapper.UserMapper.updateByPrimaryKeySelective",_entity);
    session.insert(“包名+类名", user);
    if ((i>0 && i % 1000 == 0) || i == lsize - 1) {
    // 手动每1000个一提交,提交后无法回滚
    session.commit();
    // 清理缓存,防止溢出
    session.clearCache();
    }
    }
    }
    } catch (Exception e) {
    // 没有提交的数据可以回滚
    session.rollback();
    e.printStackTrace();
    } finally {
    session.close();
    }
    }
    展开全文
  • 下面方法适用于大量(百万级别的List数据),插入到Oracle表中 private static final int OPENID_PHONE_NUM = 800; //经实践,800一批插入相对较快,这个可以随便定义 private void insertPMeSendToPhoneInfo...

    下面方法适用于大量(百万级别的List数据),插入到Oracle表中

    private static final int OPENID_PHONE_NUM = 800; //经实践,800一批插入相对较快,这个可以随便定义
    
    private void insertPMeSendToPhoneInfo(List<PMeSendToPhone> phoneList){
    
        int listSize=phoneList.size();
        int toIndex=OPENID_PHONE_NUM;
        for(int i = 0;i<phoneList.size();i+=OPENID_PHONE_NUM){
            if(i+OPENID_PHONE_NUM>listSize){//作用为toIndex最后没有800条数据则剩余几条newList中就装几条
                toIndex=listSize-i;
            }
            List<PMeSendToPhone> newPMeSendToPhoneInfo = phoneList.subList(i,i+toIndex);
            //批量插入
            pMeSendToPhoneMapper.batchInsertPMePhoneData(newPMeSendToPhoneInfo);
        }
    }

     

    /**  接口方法定义
     *批量插入
     * @param newPMeSendToPhoneInfo
     * @return
     */
    int batchInsertPMePhoneData(@Param(value = "list") List<PMeSendToPhone> newPMeSendToPhoneInfo);

    mybits配置文件定义方法

    <insert id="batchInsertPMePhoneData" parameterType="java.util.List">
      begin
      <foreach collection="list" item="item" index="index">
        insert into P_ME_SEND_TO_PHONE (PHONEID, PHONE, OPENID,  EXTEND_1,EXTEND_2, EXTEND_3)
        values(
        SEQ_P_ME_SEND_TO_PHONE.nextval,
        #{item.phone,jdbcType=VARCHAR},
        #{item.openid,jdbcType=VARCHAR},
        #{item.extend1,jdbcType=VARCHAR},
        #{item.extend2,jdbcType=VARCHAR},
        #{item.extend3,jdbcType=VARCHAR}
        );
      </foreach>
      end;
    </insert>

     

     

     

    展开全文
  • 批量插入功能是我们日常工作中比较常见的业务功能之一,今天来一个 MyBatis 批量插入的汇总篇,同时对 3 种实现方法做一个性能测试,以及相应的原理分析。 先来简单说一下 3 种批量插入功能分别是: 循环单次插入;...
  • } 方式二:使用PreparedStatement /** * 批量插入的方式二:使用PreparedStatement */ @Test public void testInsert1(){ Connection conn = null; PreparedStatement ps = null; try { conn = DBUtil.get...
  • PgBulkInsert是一个Java库,用于使用Binary COPY协议批量插入PostgreSQL。 它提供了PostgreSQL 的包装器: 是PostgreSQL特有的功能,它允许高效地批量导入表或从表导出数据。 与使用INSERT和SELECT相比,这是将...
  • 1.addBatch()、executeBatch()、clearBatch() 2.mysql服务器默认是关闭批处理的,我们需要通过一个参数,让mysql开启批处理的支持。?rewriteBatchedStatements=true 写在配置文件的url后面 3.使用更新的mysql 驱动:...
  • 本节主要内容:批量插入上万条数据到mysql的方法本文使用了mysql的批量数据格式,例如:INSERT INTO TABLES (LABLE1,LABLE2,LABLE3,...)VALUES(NUM11,NUM12,NUM13,...),(NUM21,NUM22,NUM23,...),....(NUMn1,NUMn2,...
  • 斜体样式@[TOC]Oracle批量插入6种方法小结 Oracle批量插入6种方法小结 准备 ` create table T_DQS_DATA_CRITERION_PAGE ( ID VARCHAR2(32) not null constraint T_DQS_DATA_CRITERION_PAGE_PK primary key, DATA_...
  • 虽然问题是使用JDBC高效插入Oracle,我目前正在使用DB2(在IBM大型机上),在概念上插入可能是相似的,所以认为在每次插入一个记录插入一批记录(非常有效)下面是衡量标准1)一次插入一个记录...try{Connectionconnection.....
  • catch ex as oledbexceptiontrans.rollback()fanllyconn.close()end tryend sub方式二:使用数据库中的Table类型变量实现数据插入这种方法的前提是数据库中必须支持Table类型的变量。--创建自定义表变量Create Type ...
  • oracle 批量插入与mysql 的批量插入的方式是不同的, insert into tablename()values(),(),(); ---这个是mysql 的批量插入形式 insert all into tablename() values() into tablename() values() -------这个是...
  • ????欢迎点赞 :???? 收藏 ⭐留言 ??... 如有错误敬请指正,赐人玫瑰,手留余香!...作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起...对大部分数据库来说,批量插入数据都是比较简单的事情,最
  • mysql当插入重复时更新的方法:第一种方法:示例一:插入多条记录假设有一个主键为client_id的clients表,可以使用下面的语句:INSERT INTO clients(client_id,client_name,client_type)SELECT supplier_id,supplier...
  • 假定我们的表结构如下代码如下CREATE TABLE example (example_id INT NOT NULL,name VARCHAR( 50 ) NOT NULL,value VARCHAR( 50 ) NOT NULL,other_value VARCHAR( 50 ) NOT NULL)通常情况下单条插入的sql语句我们会...
  • 下面方法适用于大量(百万级别的List数据),插入到Oracle表中 private static final int OPENID_PHONE_NUM = 800; //经实践,800一批插入相对较快,这个可以随便定义 private void insertPMeSendToPhoneInfo...
  • C# oracle 10万数据批量插入高效解决办法??C#oracle10万数据批量插入高效解决办法??------解决思路----------------------oracle没有sqlbulkcopy这是网上找到的------解决思路----------------------同网上...
  • 文章目录正常插入批量插入解决错误查询官方文档常见问题官方文档连接器官方文档高效写入数据官方文档最终结论修改后的代码       最近在使用涛思旗下tdengine数据库的时候,因为需求...
  • Java实现快速的批量插入数据

    千次阅读 2020-12-23 16:03:48
    什么是批量插入数据 一次向数据库中插入多条数据 什么是快速插入数据 快速地向数据库中插入数据 什么是快速的批量插入数据 一次向数据库中快速的批量插入数据,速度快到无需等待 在Java开发中,不论是导入...
  • 一、SQL层面实现数据插入先复习一下单条/批量插入数据的sql语句怎么写:单条插入数据的写法:insert into table ([列名],[列名]) values ([列值],[列值]));或:insert into table values ([列值],[列值]));批量插入...
  • java批量插入队列笔记

    2021-03-06 18:16:07
    往数据库里插入大量的数据,当然是批量插入高效,我们设定一个题目,每次把数据放入队列,当数据大于1000条或者时间大于5分钟后把数据批量入库队列处理代码:package bathQueue;import java.util.ArrayList;import...
  • 使用python批量插入数据到mysql的三种方法

    万次阅读 多人点赞 2018-12-20 13:54:23
    自动化单条insert # -*- coding:utf-8 -*- import time ...# 装饰器,计算插入50000条数据需要的时间 def timer(func): def decor(*args): start_time = time.time() func(*args) end_ti...
  • 在WEB项目开发过程中有时会碰到批量插入数据到数或者是将EXCEL文件据入到数据库中.为了方便实现可以先将EXCEL导入到GRIDVIEW中然后一次批量插入.实现代码如下:前台代码后台代码://首先在命名空间中加入以下两行using...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,624
精华内容 9,849
关键字:

高效批量插入方法