解决:

1.采用 少量多次的方法来处理

  1. int count= service.count();
  2. int pageSize=10000;
  3. int pageNum=(count/pageSize)+1;
  4. AtomicInteger iStart = new AtomicInteger(0);
  5. final String limit="limit ";
  6. Stream<Integer> iterate = Stream.iterate(0, i -> ++i);
  7. iterate.limit(pageNum).parallel().forEach(integer -> {
  8. QueryWrapper<Object> objectQueryWrapper = new QueryWrapper<>();
  9. objectQueryWrapper.last(limit+ iStart.getAndAdd(pageSize) +","+pageSize);
  10. List list = service.list(objectQueryWrapper);
  11. list.parallelStream().forEach(v->{
  12. //......
  13. });
  14. });

注意并发问题 iStart会被多个线程操作 所以用AtomicInteger来操作

2.Limit 优化

都知道limit 查询 在很大数据量下 越往后偏移速度越慢
优化

  1. 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自定义全局方法
关于自定义全局方法如何写 可以看官方的 案例

  1. public class LimitMethod extends AbstractMethod {
  2. @Override
  3. public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
  4. String id=tableInfo.getKeyColumn();
  5. String tableName = tableInfo.getTableName();
  6. String sql = String.format("<script> select * from %s as a join\n" +
  7. " (select %s from %s %s) as b on b.%s=a.%s </script>", tableName,
  8. id, tableName,sqlComment(),id,id);
  9. SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
  10. return addSelectMappedStatementForTable(mapperClass,"selectListByLimit",sqlSource,tableInfo);
  11. }
  12. }

注意 < script >

3.2注册自定义全局方法

  1. @Component
  2. public class MyDefinedSqlInjector extends DefaultSqlInjector {
  3. @Override
  4. public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
  5. List<AbstractMethod> methodList = super.getMethodList(mapperClass);
  6. methodList.add(new LimitMethod());
  7. return methodList;
  8. }
  9. }

3.3自定义Mapper

  1. public interface CommonMapper<T> extends BaseMapper<T> {
  2. List<T> selectListByLimit(@Param("ew") Wrapper<T> queryWrapper);
  3. }

然后 需要用这个的继承它即可

  1. public interface AdviceMapper extends CommonMapper<Advice> {
  2. }

3.4自定义Service

  1. public interface CommonService<T> extends IService<T> {
  2. List<T> listByLimit(Wrapper<T> queryWrapper);
  3. }
  1. public class CommonServiceImpl<M extends CommonMapper<T>,T> extends ServiceImpl<M,T> implements CommonService<T> {
  2. @Override
  3. public List<T> listByLimit(Wrapper<T> queryWrapper) {
  4. return this.baseMapper.selectListByLimit(queryWrapper);
  5. }
  6. }
  1. public interface AdviceService extends CommonService<Advice> {
  2. }
  1. public class AdviceServiceImpl extends CommonServiceImpl<AdviceMapper, Advice> implements AdviceService {
  2. }

3.5使用

  1. int count= service.count();
  2. int pageSize=10000;
  3. int pageNum=(count/pageSize)+1;
  4. AtomicInteger iStart = new AtomicInteger(0);
  5. final String limit="limit ";
  6. Stream<Integer> iterate = Stream.iterate(0, i -> ++i);
  7. iterate.limit(pageNum).parallel().forEach(integer -> {
  8. QueryWrapper<Object> objectQueryWrapper = new QueryWrapper<>();
  9. objectQueryWrapper.last(limit+ iStart.getAndAdd(pageSize) +","+pageSize);
  10. List list = service.list(objectQueryWrapper);
  11. list.parallelStream().forEach(v->{
  12. //......
  13. });
  14. });