1.采用 少量多次的方法来处理
int count= service.count();int pageSize=10000;int pageNum=(count/pageSize)+1;AtomicInteger iStart = new AtomicInteger(0);final String limit="limit ";Stream<Integer> iterate = Stream.iterate(0, i -> ++i);iterate.limit(pageNum).parallel().forEach(integer -> {QueryWrapper<Object> objectQueryWrapper = new QueryWrapper<>();objectQueryWrapper.last(limit+ iStart.getAndAdd(pageSize) +","+pageSize);List list = service.list(objectQueryWrapper);list.parallelStream().forEach(v->{//......});});
注意并发问题 iStart会被多个线程操作 所以用AtomicInteger来操作
2.Limit 优化
都知道limit 查询 在很大数据量下 越往后偏移速度越慢
优化
select * from A表 as a join ( select id from A表 limit offet,size ) as b on b.id=a.id
这sql可以通用啊,那我怎么加入到Mybatis plus里面啊
3.Mybatis plus SQL注入器
3.1自定义全局方法
关于自定义全局方法如何写 可以看官方的 案例
public class LimitMethod extends AbstractMethod {@Overridepublic MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {String id=tableInfo.getKeyColumn();String tableName = tableInfo.getTableName();String sql = String.format("<script> select * from %s as a join\n" +" (select %s from %s %s) as b on b.%s=a.%s </script>", tableName,id, tableName,sqlComment(),id,id);SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);return addSelectMappedStatementForTable(mapperClass,"selectListByLimit",sqlSource,tableInfo);}}
注意 < script >
3.2注册自定义全局方法
@Componentpublic class MyDefinedSqlInjector extends DefaultSqlInjector {@Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass) {List<AbstractMethod> methodList = super.getMethodList(mapperClass);methodList.add(new LimitMethod());return methodList;}}
3.3自定义Mapper
public interface CommonMapper<T> extends BaseMapper<T> {List<T> selectListByLimit(@Param("ew") Wrapper<T> queryWrapper);}
然后 需要用这个的继承它即可
public interface AdviceMapper extends CommonMapper<Advice> {}
3.4自定义Service
public interface CommonService<T> extends IService<T> {List<T> listByLimit(Wrapper<T> queryWrapper);}
public class CommonServiceImpl<M extends CommonMapper<T>,T> extends ServiceImpl<M,T> implements CommonService<T> {@Overridepublic List<T> listByLimit(Wrapper<T> queryWrapper) {return this.baseMapper.selectListByLimit(queryWrapper);}}
public interface AdviceService extends CommonService<Advice> {}
public class AdviceServiceImpl extends CommonServiceImpl<AdviceMapper, Advice> implements AdviceService {}
3.5使用
int count= service.count();int pageSize=10000;int pageNum=(count/pageSize)+1;AtomicInteger iStart = new AtomicInteger(0);final String limit="limit ";Stream<Integer> iterate = Stream.iterate(0, i -> ++i);iterate.limit(pageNum).parallel().forEach(integer -> {QueryWrapper<Object> objectQueryWrapper = new QueryWrapper<>();objectQueryWrapper.last(limit+ iStart.getAndAdd(pageSize) +","+pageSize);List list = service.list(objectQueryWrapper);list.parallelStream().forEach(v->{//......});});
