基于mybatis batch实现批量提交大量数据

网友投稿 769 2023-05-31

基于mybatis batch实现批量提交大量数据

基于mybatis batch实现批量提交大量数据

很多人在用 MyBatis 或者 通用 Mapper 时,经常会问有没有批量插入和批量更新的方法。

实际上许多时候没必要用 去实现特别复杂的批量操作。直接通过 MyBatis 的 BATCH 方式执行增删改方法即可。

下面是一个批量用法的例子:

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

select SEQ_CTAS_SHARK_FLT.nextval as recId from dual

insert into CTAS_SHARK_FLT () SELPhjaonECT SEQ_TEST.NEXTVAL, A.*

FROM (

select #{item.awbType,jdbcType=VARCHAR}, #{item.awbPre,jdbcType=VARCHAR},... from dual

) A

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

List data = new ArrayList();

for (TSharkFlt f : sharkFlts) {

data.add(getSharkFlt(f));

}

System.out.println(data.size());

long beginTime = System.currentTimeMillis();

System.out.println("开始插入...");

SqlSessionPhjaonFactory 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 tempList = new ArrayList(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) + " 毫秒!");

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:详细介绍Java阿里云的短信验证码实现
下一篇:Java接口幂等性设计原理解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~