91名师指路-头部
91名师指路

java mybatis plus实现分批查询,批量新增

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750

场景:我们表里面有1000w条数据,需要一次性全部查询出来肯定会非常的慢。并且很容易导致OOM,所以我们的解决方法就是分批查询,然后分批插入


方法一:大多数人想到的是分页查询,如我每5000条数据分一次页,这样做百分百是可以实现的,但是会存在一个问题。如果表里面的数据量越大,这种方式会越慢,因为需要计算偏移量。

int pageNum=1;
int pageSize=1000;
int offset=(pageNum - 1) * pageSize;
while (true){
List<RegionArea> regionAreaList=regionAreaMapper.selectRegionArea(offset, pageSize);
if(CollectionUtils.isEmpty(regionAreaList)){
break;
}

List<BusinessRegionArea> newRegionAreaList=new ArrayList();
regionAreaList.forEach(item -> {
BusinessRegionArea bra=new BusinessRegionArea();
bra.setId(IdUtil.getSnowflake(1, 1).nextId());
bra.setRegionCode(item.getRegionCode());
bra.setGdLng(item.getGdLng());
bra.setGdLat(item.getGdLat());
bra.setGdBoundar(item.getGdBoundar());
bra.setGdBoundarJson(item.getGdBoundarJson());
bra.setGdBoundarJsonSimplify(item.getGdBoundarJsonSimplify());
bra.setCreateTime(LocalDateTime.now());
newRegionAreaList.add(bra);
});

// 批量处理
int add=businessRegionAreaMapper.batchInsert(newRegionAreaList);
newRegionAreaList.clear(); // 清空

pageNum++;
offset=(pageNum - 1) * pageSize;
}


sql:

select * from retail.mszl_region limit #{pageSize,jdbcType=INTEGER} offset #{offset,jdbcType=INTEGER}


方法二:我们根据id来查询,前提是id是连续自增的。查询出总记录数,然后根据每次要取出的数据来计算应该需要取多少次。来循环的取出数据。

int total=300000; // 总记录数
int batchCount=5000; // 每次批量取的数据
int count=(int)Math.ceil((double)total/batchCount); // 向上取整

long maxId=1;
for(int h=0; h<count; h++){
params.put("maxId", maxId);
params.put("batchCount", batchCount);
List<ProductMonth> productList=productMonthMapper.selectJmlProductInfo(params);
if(null!=productList && productList.size()>0){
for(int i=0; i<productList.size(); i++){
long pid=productList.get(i).getId();
if(i==productList.size()-1){ // 如果是最后一个id则赋值给maxId
maxId=pid;
}
// 自己的业务处理。。。
}
}
}


xml中的查询sql如下

<select id="selectJmlProductInfo" resultMap="BaseResultMap">
select
j.id, j.product_name, j.org_all_name, j.sales_num as salesNum, p.product_no
from d_data_detail_jml j
where j.id > #{maxId} order by j.id limit #{batchCount}
</select>




2020-08-23 16:46:58     阅读(3655)

名师出品,必属精品    https://www.91mszl.com

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部