Mybaits的批量插入

本文介绍如何在MyBatis中实现高效的批量数据插入,包括XML配置细节及分批插入策略,通过实测对比批量与单条插入的时间消耗,展示批量插入的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


       由于项目需求需要有导入功能,其中需要批量插入数据到数据库当中,基于此原因考虑程序的性能和响应的速度,考虑使用mybaits的批量插入功能实现。由于项目为springmvc4.2+mybatis3.4+mysql5的开发环境进行开发。

       批量导入的核心主要是mapping当中xml的文件:

         <insertid="insertAll"parameterType="java.util.List">

  <!-- 批量插入返回插入的条数 -->

  <selectKeyresultType="java.lang.Integer"keyProperty="id"

                  order= "AFTER">

       SELECT LAST_INSERT_ID()

    </selectKey>

     insert into keyword_rank (id, send_Date,keyword,

       extension_unit, extension_plan,show_quantity,

       click_quantity, consume_quantity,click_rate,

      click_average_price, account,web_page_conversion,

       merchant_bridge_conversion,telephone_conversion,

      average_order, type)

     values

     <foreachcollection="list"item="keywordRank"index="index"separator=",">

     (

         #{keywordRank.id,jdbcType=VARCHAR},

         #{keywordRank.sendDate,jdbcType=TIMESTAMP},

       #{keywordRank.keyword,jdbcType=VARCHAR},

     #{keywordRank.extensionUnit,jdbcType=VARCHAR},

            #{keywordRank.extensionPlan,jdbcType=VARCHAR},

           #{keywordRank.showQuantity,jdbcType=DECIMAL},

            #{keywordRank.clickQuantity,jdbcType=DECIMAL},

            #{keywordRank.consumeQuantity,jdbcType=DECIMAL},

            #{keywordRank.clickRate},

            #{keywordRank.clickAveragePrice,jdbcType=DECIMAL},

            #{keywordRank.account,jdbcType=VARCHAR},

            #{keywordRank.webPageConversion,jdbcType=DECIMAL},

            #{keywordRank.merchantBridgeConversion,jdbcType=DECIMAL},

            #{keywordRank.telephoneConversion,jdbcType=DECIMAL},

            #{keywordRank.averageOrder,jdbcType=DECIMAL},

            #{keywordRank.type,jdbcType=VARCHAR}

          )

     </foreach>

对应的到接口如下:

    /**

     * 批量插入功能

      * @param list

      * @return

     */

    public int insertAll(List<KeywordRankEntity>list);

service层的是引用:

           /**

      * 批量插入

     * @param record

     * @return

     */

    @Transactional(readOnly=false)

    public int keywordRankInserts(List<KeywordRankEntity> list){

//     //主要是防止大量数据库插入超时链接导致数据插入失败

//     int sumCount = 0;

//     for(int i = 0 ; i < (list.size()/10000) +1 ;i++){

//         if(list.size() % 10000 == 0 || i < list.size()/10000){

//            List<KeywordRankEntity> list1 =list.subList(i*10000, (i+1)*10000);

//            sumCount += keywordRankDao.insertAll(list1);

//         }else if(list.size() % 10000 != 0){

//            List<KeywordRankEntity> list1 =list.subList(i*10000, list.size());

//            sumCount += keywordRankDao.insertAll(list1);

//         }

//     }

//     return sumCount;

       returnkeywordRankDao.insertAll(list);

    }

由于本项目当中的导入数据量非常小没必要实现分批插入的情况,因此直接插入数据便会达到最优化的情况,测试插入8900条情况和时间消耗如下:

    timeis : 18770.0    单个插入的总时间;

time is : 18900.0    单个插入第二次整体插入;

 

time1 is : 16620.0   空表导入批量插入时间10000

time1 is : 4815.0    表中已经存在数据第二次导入

 

time1 is : 7344.0     空表导入批量插入时间所有的批量一起

time1 is : 6785.0     表中已经存在数据第二次导入

 

time1 is : 9088.0    空表导入批量插入时间:氛围2000条分批插入

time1 is : 8988.0    表中已经存在数据第二次导入  

综上分析当数据量比较大的时候建议分条数插入这样可以防止数据连接插入超时导致插入失败的情况。有此次导入测试批量插入可以看出使用批量插入和单个逐条插入明显看到时间减半,在适当的时候使用批量插入可减少链接数据库的连接数同样可以减少不必要的运算开销,从而大大提高了程序的性能。

    如有错误希望可以帮忙纠正错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值