Mybatis+Oracle插入万条数据

简介: Mybatis+Oracle插入万条数据

最近工作中使用到批量删除,试了试网上的几种方法,下面三种方法都是插入2万条数据

使用oracle的insert all

特别注意:mysql默认接受sql的大小是1048576(1M),若数据量超过1M会报如异常错误者可以,进行分开处理,每次提交一定的数据到数据库,还可以通过调整MySQL安装目录下的my.ini文件中[mysqld]段的"max_allowed_packet = 1M"),增加max_allowed_packet 的容量。

mybatis的xml编写

使用到oracle批量插入的方法insert all

    <insert id="insertBatch3" useGeneratedKeys="false" parameterType="list">
        INSERT ALL
        <foreach collection ="list" item="applicationConsumables" index="index" separator =" ">
            INTO APPLICATION_CONSUMABLES_TB(
            BUSINESS_ID,
            GENERATE_DATE,
            CREATE_DATE,
            UPDATE_DATE,
            ARCHIVE_DATE,
            PATIENT_ID,
            AREA_ID,
            ORG_ID,
            ORG_NAME,
            WS98_00_909_35,
            WS98_00_909_36,
            ZJ99_JH_SBS,
            ZJ99_TY_CG_CS,
            ZJ99_TY_DB_CS,
            ZJ99_CG_JH_ZXS,
            ZJ99_CG_ZS,
            ZJ99_GYS_PS_WCZS,
            ZJ99_XPS_ZS
            )
            VALUES
            (
            #{applicationConsumables.businessId,jdbcType=VARCHAR},
            decode(#{applicationConsumables.generateDate,jdbcType=DATE},null,null,to_date(to_char(#{applicationConsumables.generateDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            decode(#{applicationConsumables.createDate,jdbcType=DATE},null,sysdate,to_date(#{applicationConsumables.createDate,jdbcType=DATE},'yyyy-MM-dd')),
            decode(#{applicationConsumables.updateDate,jdbcType=DATE},null,sysdate,to_date(to_char(#{applicationConsumables.updateDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            decode(#{applicationConsumables.archiveDate,jdbcType=DATE},null,null,to_date(to_char(#{applicationConsumables.archiveDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            #{applicationConsumables.patientId,jdbcType=VARCHAR},
            #{applicationConsumables.areaId,jdbcType=VARCHAR},
            #{applicationConsumables.orgId,jdbcType=VARCHAR},
            #{applicationConsumables.orgName,jdbcType=VARCHAR},
            #{applicationConsumables.ws980090935,jdbcType=VARCHAR},
            #{applicationConsumables.ws980090936,jdbcType=VARCHAR},
            #{applicationConsumables.zj99JhSbs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99TyCgCs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99TyDbCs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99CgJhZxs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99CgZs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99GysPsWczs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99XpsZs,jdbcType=NUMERIC}
            )
        </foreach>
        SELECT 1 FROM DUAL
    </insert>

代码

把json数据转对象,一次提交插入500条

    @Override
    public boolean insertBatch3(Map param) throws Exception {
        List list = JsonArrayToPojoList.jsonToList(param, ApplicationConsumablesPojo.class);
        int nums = 500; // 一次插入200条
        int times = (int)Math.ceil((float)list.size() / nums);// 插入次数
        try{
            ApplicationConsumablesPojo pojo= (ApplicationConsumablesPojo)list.get(0);
            applicationConsumablesMapper.deleteBatch(pojo.getGenerateDate(),pojo.getOrgId());
            for(int i=0; i < times; i++){
                if(i == times - 1) {
                    applicationConsumablesMapper.insertBatch3(list.subList(i * nums, list.size()));
                }else {
                    applicationConsumablesMapper.insertBatch3(list.subList(i * nums, (i+1) * nums));
                }
            }
        } catch(Exception e){
            return false;
        }
        return true;
    }

利用存储过程实现批量插入

mybatis的xml编写

useGeneratedKeys=“false”,表示不需要JDBC自动生成主键

     <insert id="insertBatch" useGeneratedKeys="false" parameterType="list">
        BEGIN
        <foreach collection ="list" item="applicationConsumables" index="index" separator =";">
        INSERT INTO APPLICATION_CONSUMABLES_TB(
            BUSINESS_ID,
            GENERATE_DATE,
            CREATE_DATE,
            UPDATE_DATE,
            ARCHIVE_DATE,
            PATIENT_ID,
            AREA_ID,
            ORG_ID,
            ORG_NAME,
            WS98_00_909_35,
            WS98_00_909_36,
            ZJ99_JH_SBS,
            ZJ99_TY_CG_CS,
            ZJ99_TY_DB_CS,
            ZJ99_CG_JH_ZXS,
            ZJ99_CG_ZS,
            ZJ99_GYS_PS_WCZS,
            ZJ99_XPS_ZS
        )
        VALUES
        (
            #{applicationConsumables.businessId,jdbcType=VARCHAR},
            decode(#{applicationConsumables.generateDate,jdbcType=DATE},null,null,to_date(to_char(#{applicationConsumables.generateDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            decode(#{applicationConsumables.createDate,jdbcType=DATE},null,sysdate,to_date(#{applicationConsumables.createDate,jdbcType=DATE},'yyyy-MM-dd')),
            decode(#{applicationConsumables.updateDate,jdbcType=DATE},null,sysdate,to_date(to_char(#{applicationConsumables.updateDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            decode(#{applicationConsumables.archiveDate,jdbcType=DATE},null,null,to_date(to_char(#{applicationConsumables.archiveDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            #{applicationConsumables.patientId,jdbcType=VARCHAR},
            #{applicationConsumables.areaId,jdbcType=VARCHAR},
            #{applicationConsumables.orgId,jdbcType=VARCHAR},
            #{applicationConsumables.orgName,jdbcType=VARCHAR},
            #{applicationConsumables.ws980090935,jdbcType=VARCHAR},
            #{applicationConsumables.ws980090936,jdbcType=VARCHAR},
            #{applicationConsumables.zj99JhSbs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99TyCgCs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99TyDbCs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99CgJhZxs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99CgZs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99GysPsWczs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99XpsZs,jdbcType=NUMERIC}
        )
        </foreach>
        ;END ;
    </insert>

代码

    @Override
    public boolean insertBatch(Map param) throws Exception{
        List list = JsonArrayToPojoList.jsonToList(param, ApplicationConsumablesPojo.class);
        int result = 1;
        SqlSession batchSqlSession = null;
        try {
            ApplicationConsumablesPojo pojo= (ApplicationConsumablesPojo)list.get(0);
            applicationConsumablesMapper.deleteBatch(pojo.getGenerateDate(),pojo.getOrgId());
            batchSqlSession = this.sqlSessionTemplate
                    .getSqlSessionFactory()
                    .openSession(ExecutorType.BATCH, false);// 获取批量方式的sqlsession
            int batchCount = 500;// 每批commit的个数
            int batchLastIndex = batchCount;// 每批最后一个的下标
            long startDate=System.currentTimeMillis();
            for (int index = 0; index < list.size(); ) {
                if (batchLastIndex >= list.size()) {
                    batchLastIndex = list.size();
                    result = result + applicationConsumablesMapper.insertBatch(list.subList(index, batchLastIndex));
                    batchSqlSession.commit();
                    //清理缓存,防止溢出
                    batchSqlSession.clearCache();
                    System.out.println("index:" + index + " batchLastIndex:" + batchLastIndex);
                    break;// 数据插入完毕,退出循环
                } else {
                    result = result + applicationConsumablesMapper.insertBatch(list.subList(index, batchLastIndex));
                    batchSqlSession.commit();
                    //清理缓存,防止溢出
                    batchSqlSession.clearCache();
                    System.out.println("index:" + index + " batchLastIndex:" + batchLastIndex);
                    index = batchLastIndex;// 设置下一批下标
                    batchLastIndex = index + (batchCount - 1);
                }
            }
            long end=System.currentTimeMillis();
            long costTime=end-startDate;
            log.info("----------------------------"+costTime+"--------------------");
            batchSqlSession.commit();
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            batchSqlSession.close();
        }
        return true;
    }

利用标签

mybatis的xml编写

    <insert id="insertBatch2" useGeneratedKeys="false" parameterType="list">
            INSERT INTO APPLICATION_CONSUMABLES_TB(
            BUSINESS_ID,
            GENERATE_DATE,
            CREATE_DATE,
            UPDATE_DATE,
            ARCHIVE_DATE,
            PATIENT_ID,
            AREA_ID,
            ORG_ID,
            ORG_NAME,
            WS98_00_909_35,
            WS98_00_909_36,
            ZJ99_JH_SBS,
            ZJ99_TY_CG_CS,
            ZJ99_TY_DB_CS,
            ZJ99_CG_JH_ZXS,
            ZJ99_CG_ZS,
            ZJ99_GYS_PS_WCZS,
            ZJ99_XPS_ZS
            )
            (
        <foreach collection ="list" item="applicationConsumables" index="index" separator="union all">
            select
            #{applicationConsumables.businessId,jdbcType=VARCHAR},
            decode(#{applicationConsumables.generateDate,jdbcType=DATE},null,null,to_date(to_char(#{applicationConsumables.generateDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            decode(#{applicationConsumables.createDate,jdbcType=DATE},null,sysdate,to_date(#{applicationConsumables.createDate,jdbcType=DATE},'yyyy-MM-dd')),
            decode(#{applicationConsumables.updateDate,jdbcType=DATE},null,sysdate,to_date(to_char(#{applicationConsumables.updateDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            decode(#{applicationConsumables.archiveDate,jdbcType=DATE},null,null,to_date(to_char(#{applicationConsumables.archiveDate,jdbcType=DATE},'yyyy-MM-dd'),'yyyy-MM-dd')),
            #{applicationConsumables.patientId,jdbcType=VARCHAR},
            #{applicationConsumables.areaId,jdbcType=VARCHAR},
            #{applicationConsumables.orgId,jdbcType=VARCHAR},
            #{applicationConsumables.orgName,jdbcType=VARCHAR},
            #{applicationConsumables.ws980090935,jdbcType=VARCHAR},
            #{applicationConsumables.ws980090936,jdbcType=VARCHAR},
            #{applicationConsumables.zj99JhSbs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99TyCgCs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99TyDbCs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99CgJhZxs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99CgZs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99GysPsWczs,jdbcType=NUMERIC},
            #{applicationConsumables.zj99XpsZs,jdbcType=NUMERIC}
            from dual
           </foreach>
          )
    </insert>

代码

    @Override
    public boolean insertBatch2(Map param) throws Exception {
        List list = JsonArrayToPojoList.jsonToList(param, ApplicationConsumablesPojo.class);
        int nums = 500; // 一次插入200条
        int times = (int)Math.ceil((float)list.size() / nums);// 插入次数
        try{
            ApplicationConsumablesPojo pojo= (ApplicationConsumablesPojo)list.get(0);
            applicationConsumablesMapper.deleteBatch(pojo.getGenerateDate(),pojo.getOrgId());
            for(int i=0; i < times; i++){
                if(i == times - 1) {
                    applicationConsumablesMapper.insertBatch2(list.subList(i * nums, list.size()));
                }else {
                    applicationConsumablesMapper.insertBatch2(list.subList(i * nums, (i+1) * nums));
                }
            }
        } catch(Exception e){
            return false;
        }
        return true;
    }

三种方式耗时对比

批量插入条数200条时

| 方式 | 数据量|耗时(秒) |

|–|–|–|–|

| 利用存储过程实现批量插入 | 2万 |22.233|

| 利用foreach标签 | 2万 |13.023|

| 使用oracle的insert all | 2万 |17.489|


批量插入条数500条时

| 方式 | 数据量|耗时(秒) |

|–|–|–|–|

| 利用存储过程实现批量插入 | 2万 |16.906|

| 利用foreach标签 | 2万 |13.058|

| 使用oracle的insert all | 2万 |16.139|

批量插入条数1000条时

| 方式 | 数据量|耗时(秒) |

|–|–|–|–|

| 利用存储过程实现批量插入 | 2万 |60.583|

| 利用foreach标签 | 2万 |13.124|

| 使用oracle的insert all | 2万 |16.478|

每次写入的数量,以及网络环境对花费的时间也是有很大的影响的。

相关文章
|
2月前
|
Java 数据库连接 数据库
mybatis查询数据,返回的对象少了一个字段
mybatis查询数据,返回的对象少了一个字段
176 8
|
8天前
|
存储 Oracle 关系型数据库
【赵渝强老师】Oracle的还原数据
Oracle数据库中的还原数据(也称为undo数据或撤销数据)存储在还原表空间中,主要用于支持查询的一致性读取、实现闪回技术和恢复失败的事务。文章通过示例详细介绍了还原数据的工作原理和应用场景。
【赵渝强老师】Oracle的还原数据
|
3月前
|
SQL 运维 Oracle
【迁移秘籍揭晓】ADB如何助你一臂之力,轻松玩转Oracle至ADB的数据大转移?
【8月更文挑战第27天】ADB(Autonomous Database)是由甲骨文公司推出的自动化的数据库服务,它极大简化了数据库的运维工作。在从传统Oracle数据库升级至ADB的过程中,数据迁移至关重要。
67 0
|
3月前
|
数据采集 Oracle 关系型数据库
实时计算 Flink版产品使用问题之怎么实现从Oracle数据库读取多个表并将数据写入到Iceberg表
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
8天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
8天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的数据文件
在Oracle数据库中,数据库由多个表空间组成,每个表空间包含多个数据文件。数据文件存储实际的数据库数据。查询时,如果内存中没有所需数据,Oracle会从数据文件中读取并加载到内存。可通过SQL语句查看和管理数据文件。附有视频讲解及示例。
|
1月前
|
Oracle 关系型数据库 数据库
oracle数据创建同义词
oracle数据创建同义词
48 0
|
3月前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
273 1
|
3月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。

推荐镜像

更多