Java8 Function函数式编程分批查询示例
查询时需要对参数做特殊处理的场景
当数据库的in的字段数或者长度有限制时,全量去查询可能会报错,这时候需要分批查询
当然分批查询有很多方式,比如统一在切面中处理,这样也很方便,但如果因为各种原因不用切面,
那么可以使用参数抽象式的Function函数来处理
这个是原始方法,list超过限定长度,sql会报错
@Override
public List<User> queryList(Long id, List<Long> list) {
return userMapper.queryList(id, list);
}
这个是改造后,直接调用工具类,传入函数,这样的方式就很直观
@Override
public List<User> queryList(Long id, List<Long> list) {
return BatchQueryUtil.batchQuery(o -> userMapper.queryList(id, (List<Long>) o), list);
}
下面展示一些 内联代码片
。
public class BatchQueryUtil {
/**
*单线程分批查询,每次最多查询500条
*/
public static <R> R batchQuery(Function<Object,R> function, List<? extends Object> list) {
if(CollectionUtils.isNotEmpty(list)){
List result = new ArrayList<>();
ListUtils.partition(list,500).forEach(x->{
Object apply = function.apply(x);
result.addAll((List)apply);
});
return (R)result;
}
return function.apply(list);
}
/**
* 多个线程并发分批查询,超过500后每次最多查询500条
*/
public static <R> R batchQueryByParallel(Function<Object,R> function, List<? extends Object> list) {
if(CollectionUtils.isNotEmpty(list) && list.size()>500){
List result = new CopyOnWriteArrayList();
ListUtils.partition(list,500).parallelStream().forEach(x->{
Object apply = function.apply(x);
result.addAll((List)apply);
});
return (R)result;
}
return function.apply(list);
}
}