Java 基于mybatis plus的mysql数据库分页遍历工具

实现一:基于Supplier

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;

/**
 * 数据库分页访问工具类
 * 
 * @param <T> 数据类型
 */
public class PagingDataSupplier<T> implements Supplier<List<T>> {
    /**
     * 页码
     */
    private Integer pageNo = 1;
    /**
     * 总页数
     */
    private final Integer pages;
    /**
     * 分页大小
     */
    private final Integer pageSize;
    /**
     * mapper,用于映射SQL访问数据库
     */
    private final BaseMapper<T> mapper;
    /**
     * 查询条件,用于查询总数和拼接limit
     */
    private final LambdaQueryWrapper<T> queryWrapper;

    public PagingDataSupplier(Integer pageSize, BaseMapper<T> mapper, LambdaQueryWrapper<T> queryWrapper) {
        Integer total = mapper.selectCount(queryWrapper);
        this.mapper = mapper;
        this.pageSize = pageSize;
        this.queryWrapper = queryWrapper;
        this.pages = Double.valueOf(Math.ceil(total.doubleValue() / pageSize.doubleValue())).intValue();
    }

    @Override
    public List<T> get() {
        if (pageNo <= pages) {
            // 每次查询后给页码+1,表示翻页
            queryWrapper.last(String.format("LIMIT %d,%d", (pageNo++ - 1) * pageSize, pageSize));
            return mapper.selectList(queryWrapper);
        }
        // 返回空集合,减少!=null判断
        return Collections.emptyList();
    }
}

实现二:基于Iterator

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * 数据库分页访问工具类
 * 
 * @param <T> 数据类型
 */
public class PagingDataIterator<T> implements Iterator<List<T>> {

    /**
     * 页码
     */
    private Integer pageNo = 1;
    /**
     * 总页数
     */
    private final Integer pages;
    /**
     * 分页大小
     */
    private final Integer pageSize;
    /**
     * mapper,用于映射SQL访问数据库
     */
    private final BaseMapper<T> mapper;
    /**
     * 查询条件,用于查询总数和拼接limit
     */
    private final LambdaQueryWrapper<T> queryWrapper;

    public PagingDataIterator(Integer pageSize, BaseMapper<T> mapper, LambdaQueryWrapper<T> queryWrapper) {
        Integer total = mapper.selectCount(queryWrapper);
        this.mapper = mapper;
        this.pageSize = pageSize;
        this.queryWrapper = queryWrapper;
        this.pages = Double.valueOf(Math.ceil(total.doubleValue() / pageSize.doubleValue())).intValue();
    }

    @Override
    public boolean hasNext() {
        return pageNo <= pages;
    }

    @Override
    public List<T> next() {
        if (hasNext()) {
            // 每次查询后给页码+1,表示翻页
            queryWrapper.last(String.format("LIMIT %d,%d", (pageNo++ - 1) * pageSize, pageSize));
            return mapper.selectList(queryWrapper);
        }
        // 返回空集合,减少!=null判断
        return Collections.emptyList();
    }

	public Stream<T> stream(){
        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(this, 0), false)
                .flatMap(List::stream);
    }

    public Integer getPageNo() {
        return pageNo;
    }

    public Integer getPages() {
        return pages;
    }
}

  • 0
    点赞
  • 3
    收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 2

打赏作者

益达哥哥

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值