分页查询迭代器

分页查询迭代器 #

作用:分页查询大量数据用的迭代器。

核心类:

  • PageQueryIterator
  • PageQueryCollection

PageQueryIterator #

java
import com.github.pagehelper.ISelect;
import com.github.pagehelper.Page;

import java.util.Iterator;

/**
 * 分页查询大量数据用的迭代器
 *
 * @author jiahui156
 */
public class PageQueryIterator<E> implements Iterator<E> {
    private static final int DEFAULT_PAGE_SIZE = 200;

    private final ISelect selectFunc;
    private final int pageSize;

    private Iterator<E> pageIterator;
    private int pageNum = 1;
    private boolean lastPage;

    public PageQueryIterator(ISelect selectFunc) {
        this(selectFunc, DEFAULT_PAGE_SIZE);
    }

    public PageQueryIterator(ISelect selectFunc, int pageSize) {
        this.selectFunc = selectFunc;
        this.pageSize = pageSize;
    }

    @Override
    public boolean hasNext() {
        return getPageIterator().hasNext();
    }

    @Override
    public E next() {
        return getPageIterator().next();
    }

    private Iterator<E> getPageIterator() {
        if (pageIterator != null && (pageIterator.hasNext() || lastPage)) {
            return pageIterator;
        }
        Page<E> page = PageUtils.startPage(pageNum, pageSize, false).doSelectPage(selectFunc);
        pageIterator = page.iterator();
        pageNum++;
        lastPage = page.size() < pageSize;
        return pageIterator;
    }
}

PageQueryCollection #

java
import com.github.pagehelper.ISelect;

import java.util.AbstractCollection;
import java.util.Iterator;
import java.util.function.Supplier;

/**
 * 分页查询大量数据用的集合
 *
 * @author jiahui156
 */
public class PageQueryCollection<E> extends AbstractCollection<E> {
    private final ISelect selectFunc;
    private final Supplier<PageQueryIterator<E>> iteratorFactory;
    private int size = -1;

    public PageQueryCollection(ISelect selectFunc) {
        this.selectFunc = selectFunc;
        this.iteratorFactory = () -> new PageQueryIterator<>(selectFunc);
    }

    public PageQueryCollection(ISelect selectFunc, int pageSize) {
        this.selectFunc = selectFunc;
        this.iteratorFactory = () -> new PageQueryIterator<>(selectFunc, pageSize);
    }

    @Override
    public Iterator<E> iterator() {
        return iteratorFactory.get();
    }

    @Override
    public int size() {
        if (size == -1) {
            size = (int) PageUtils.count(selectFunc);
        }
        return size;
    }
}
2024年10月28日