批处理方式
@Resource
SqlSessionFactory sessionFactory;
@Test
void test1() {
//使用批处理, 开启事务, 打开一个会话
SqlSession sqlSession = sessionFactory.openSession(ExecutorType.BATCH, false);
//取得statementMapper, 执行sql语句
NationReportSaveDao mapper = sqlSession.getMapper(NationReportSaveDao.class);
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
//伪造数据源
String xmid = "xmid337" + i;
AreaStatisticsDataDTO dataDTO = AreaStatisticsDataDTO.builder()
.housesTypeName("普通住宅")
.sortNum(2)
.surveyingTotalArea(new BigDecimal(213.3))
.unsellableArea(new BigDecimal(452.1))
.totalSaleableArea(new BigDecimal(567.2))
.soldArea(new BigDecimal(234.2))
.remainingSaleableArea(new BigDecimal(562.1))
.selfArea(new BigDecimal(61.7))
.rentalArea(new BigDecimal(81.92))
.remark("说明23333")
.build();
//执行批处理
mapper.saveAreaStatistic(xmid, dataDTO);
}
long end = System.currentTimeMillis();
System.out.println((end-start)/1000.0);
//提交
sqlSession.commit();
//关闭会话
sqlSession.close();
}
批处理所用时间

普通方式
@Test
void test2() {
//使用批处理, 开启事务, 打开一个会话
SqlSession sqlSession = sessionFactory.openSession();
//取得statementMapper, 执行sql语句
NationReportSaveDao mapper = sqlSession.getMapper(NationReportSaveDao.class);
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
//伪造数据源
String xmid = "xmid21337" + i;
AreaStatisticsDataDTO dataDTO = AreaStatisticsDataDTO.builder()
.housesTypeName("普通住宅")
.sortNum(2)
.surveyingTotalArea(new BigDecimal(213.3))
.unsellableArea(new BigDecimal(452.1))
.totalSaleableArea(new BigDecimal(567.2))
.soldArea(new BigDecimal(234.2))
.remainingSaleableArea(new BigDecimal(562.1))
.selfArea(new BigDecimal(61.7))
.rentalArea(new BigDecimal(81.92))
.remark("说明23333")
.build();
//执行批处理
mapper.saveAreaStatistic(xmid, dataDTO);
}
long end = System.currentTimeMillis();
System.out.println((end - start)/1000.0);
//关闭会话
sqlSession.close();
}
普通方式所用时间

总结
对于10000条数据的插入,批处理时间1秒左右,而普通insert长达10分钟,差距显著。对于多条数据插入,建议使用批处理方式。
博客通过对比mybatis中批处理和普通方式插入10000条数据,发现批处理仅用1秒,而普通方式耗时10分钟,强调批处理在大量数据插入时的高效性。
1108





