分页查询迭代器 #
作用:分页查询大量数据用的迭代器。
核心类:
- 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;
}
}