• mybatis batch批量提交大量数据


    转载:https://blog.csdn.net/Java_Mr_Zheng/article/details/50476757

    在xml文件配置多条参数同时插入:

    <insert id="insertBatch2" parameterType="ctas.entity.SharkFlt">
         <selectKey keyProperty="recId" order="BEFORE" resultType="Long">
          select SEQ_CTAS_SHARK_FLT.nextval as recId from dual
       </selectKey>
         insert into CTAS_SHARK_FLT (<include refid="Base_Column_List"/>) SELECT SEQ_TEST.NEXTVAL, A.*
         FROM (
         <foreach collection="list" item="item" index="index" open="" close="" separator="union all">
           select #{item.awbType,jdbcType=VARCHAR}, #{item.awbPre,jdbcType=VARCHAR},... from dual
      </foreach>
        ) A
     </insert>

    在Java代码中,oracle中一次执行的sql语句长度是有限制的,如果最后拼出来的sql字符串过长,会导致执行失败,所以java端还要做一个分段处理,参考下面的处理:

    List<SharkFlt> data = new ArrayList<SharkFlt>();
              for (TSharkFlt f : sharkFlts) {
                 data.add(getSharkFlt(f));
             }
     
            System.out.println(data.size());
             long beginTime = System.currentTimeMillis();
            System.out.println("开始插入...");
             SqlSessionFactory sqlSessionFactory 
    =ctx.getBean(SqlSessionFactory.class);
             SqlSession session = null;
            try {
                 session = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
                 int a = 2000;//每次提交2000条
                 int loop = (int) Math.ceil(data.size() / (double) a);
     
                 List<SharkFlt> tempList = new ArrayList<SharkFlt>(a);
               int start, stop;
                for (int i = 0; i < loop; i++) {
                   tempList.clear();
                   start = i * a;
                    stop = Math.min(i * a + a - 1, data.size() - 1);
                    System.out.println("range:" + start + " - " + stop);
                    for (int j = start; j <= stop; j++) {
                         tempList.add(data.get(j));
                   }
                     session.insert("ctas.importer.writer.mybatis.mappper.SharkFltMapper.insertBatch2", tempList);
                   session.commit();
                    session.clearCache();
                     System.out.println("已经插入" + (stop + 1) + " 条");
                 }
             } catch (Exception e) {
                 e.printStackTrace();
                 session.rollback();
            } finally {
               if (session != null) {
                    session.close();
                }
             }
            long endTime = System.currentTimeMillis();
            System.out.println("插入完成,耗时 " + (endTime - beginTime) + " 毫秒!");
  • 相关阅读:
    巴洛克式和哥特式的区别
    推荐阅读书籍,是时候再行动起来了。
    AtCoder ABC 159F Knapsack for All Segments
    AtCoder ABC 159E Dividing Chocolate
    AtCoder ABC 158F Removing Robots
    AtCoder ABC 158E Divisible Substring
    AtCoder ABC 157F Yakiniku Optimization Problem
    AtCoder ABC 157E Simple String Queries
    AtCoder ABC 157D Friend Suggestions
    AtCoder ABC 156F Modularness
  • 原文地址:https://www.cnblogs.com/zxf330301/p/9966343.html
Copyright © 2020-2023  润新知