方案一:
// 定义函数回调
@FunctionalInterface
public interface DataProcess {
/**
* 处理数据方法
*
* @param dataList
* @return true:继续处理,false:终止处理
*/
public boolean process(List<Map<String, Object>> dataList);
}
// 查询数据 在某个service类里封装好 分页查询
public void getListDataBatch(DataQueryDTO dataQueryDTO,
DataProcess dataProcess){
// 批的大小
int batchSize = dataQueryDTO.getSize();
int current = 1;
List<Map<String, Object>> dataList = new ArrayList<>(batchSize);
do {
dataQueryDTO.setCurrent(current);
PageInfo<Map<String, Object>> result = dataService.getPageByCondition(dataQueryDTO);
if (result == null){
// 未查到数据 空 结束循环
break;
}else{
dataList = result.getData();
// 回调处理数据
dataProcess.process(dataList);
}
}while (CollUtil.isNotEmpty(dataList) && dataList.size() == batchSize);
}
// 调用方
DataQueryDTO dto = new DataQueryDTO();
dto.setSize(500); // 批大小设置成500 可将此数量作为常量类配置
dto.setParams(); // 其他查询条件
getListDataBatch(dto,dataList->{
if (CollUtil.isEmpty(dataList)){
return;
}
// 处理dataList数据
...
});
方案二:
int page = 1, pageSize = Constant.QUERY_BATCH_SIZE; // 500
for (;;) {
// query 查询参数 page 页码 pageSize 每页大小
final List<CustomerDO> listData = customerService.getListDataPage(query,page,pageSize);
if (CollUtil.isEmpty(listData)) {
break;
}
// 处理业务数据
processData(listData);
if (listData.size() < pageSize) {
break;
}
page++;
}