吉安感知网项目-后端
xiebin
2026-01-06 d207a86cdf1ab52ef8cb7cd83bad8fceab8038cf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package org.sxkj.common.query;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.util.CollectionUtils;
 
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
 
/**
 * 分页处理工具类
 */
public class PaginationUtils {
 
    /**
     * 通用分页处理方法
     * @param mapper MyBatis-Plus Mapper接口
     * @param pageSize 每页大小
     * @param queryWrapperBuilder 查询条件构建函数
     * @param pageDataProcessor 每页数据处理函数
     * @param <T> 实体类型
     * @param <M> Mapper类型
     */
    public static <T, M extends BaseMapper<T>> void processInPages(
        M mapper,
        int pageSize,
        Function<Integer, Wrapper<T>> queryWrapperBuilder,
        Consumer<Page<T>> pageDataProcessor) {
 
        int currentPage = 1;
        boolean hasNext = true;
 
        while (hasNext) {
            // 创建分页对象
            Page<T> page = new Page<>(currentPage, pageSize);
 
            // 构建当前页的查询条件
            Wrapper<T> wrapper = queryWrapperBuilder.apply(currentPage);
 
            // 执行分页查询
            Page<T> resultPage = mapper.selectPage(page, wrapper);
            List<T> records = resultPage.getRecords();
 
            // 处理当前页数据
            if (!CollectionUtils.isEmpty(records)) {
                pageDataProcessor.accept(resultPage);
            }
 
            // 判断是否还有下一页
            hasNext = currentPage < resultPage.getPages() && !CollectionUtils.isEmpty(records);
            currentPage++;
        }
    }
 
    /**
     * 简化版分页处理(不需要当前页码构建查询条件)
     * @param mapper MyBatis-Plus Mapper接口
     * @param pageSize 每页大小
     * @param queryWrapper 固定查询条件
     * @param pageDataProcessor 每页数据处理函数
     * @param <T> 实体类型
     * @param <M> Mapper类型
     */
    public static <T, M extends BaseMapper<T>> void processInPages(
        M mapper,
        int pageSize,
        Wrapper<T> queryWrapper,
        Consumer<Page<T>> pageDataProcessor) {
 
        processInPages(mapper, pageSize, page -> queryWrapper, pageDataProcessor);
    }
}