使用MybatisPlus对List进行分页函数 & java8的stream如何实现分页

导读:本篇文章讲解 使用MybatisPlus对List进行分页函数 & java8的stream如何实现分页,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

有时候mybatis-plus的Ipage分页不能满足我们的需求,那有什么好的分页办法呢?

方案 优点 缺点
可以分页 如果服务器内存小,表数据量大,内存溢出可能性非常大
代码看起来比较高级,用了java8的stream 同上
无论表多大都可以使用,不需要担心性能问题 代码不是很美观

一 自定义分页工具方法

package com.fox.test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class MyDemo {

    public static void main(String[] args) {
        // pageNum 页码数   pageSize 页容量
        int pageNum = 2;
        int pageSize = 3;
        List<String> list = new ArrayList<>();
        list.add("刘一");
        list.add("陈二");
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        list.add("孙七");
        list.add("周八");
        list.add("吴九");
        list.add("郑十");
        list.add("不知道了。。。");
        
		System.out.println("总条数:" + list.size());

		System.out.println("----------");
        List<String> limitList = getLimitList(list, pageNum, pageSize);
        for (String s : limitList) {
            System.out.println(s);
        }
    }
    
    /**
     * 利用list的subList方法进行分页
     * @param list 需要分页的list,一般为全量
     * @param pageNum 当前页
     * @param pageSize 每页大小
     * @param <E> 元素
     * @return list
     */
    private static <E> List<E> getLimitList(List<E> list, Integer pageNum, Integer pageSize) {
        if (list == null || list.size() <= 0) {
            return list;
        }
        // 如果参数不符合规范。设置默认值,第1页,每页10条
        if (pageNum == null || pageNum < 1) {
            pageNum = 1;
        }
        if (pageSize == null || pageSize < 0) {
            pageSize = 10;
        }

        // 计算需要截取list的开始和结束下标
        int start = (pageNum - 1) * pageSize;
        int end = start + pageSize;

        // 开始和结束下标 如果超过list大小,为了避免空指针,将其赋值为当前list的大小
        if(start > list.size()){
            start = list.size();
        }
        if(end > list.size()){
            end = list.size();
        }
        // subList(start, end)包括下标为start的值,不包括下标为end的值,如果一样,返回空list
        return list.subList(start, end);
    }
}

结果如下
在这里插入图片描述

subList不会使用的可以自己使用,看看效果。比如上面list大小为11个元素,下标的话最大为10(因为从0开始),而subList,开始和结束最大下标允许为11

		List<String> resultList = list.subList(2, 5);
        for (String s : resultList) {
            System.out.println(s);
        }

二 使用java8的stream来分页

这种一次性查出来的数据如果相当大,比如1GB、10GB,有可能发生内存溢出。一万条数据(60个字段)大概3MB。建议表数据量在100万条数据内,使用此方法。 不要抬杠,根据实际情况来

封装了一个泛型方法,拿去不谢

	/**
     * 利用java8的stream对list进行分页
     * @param list 需要分页的list,一般为全量
     * @param pageNum 当前页
     * @param pageSize 每页大小
     * @param <E> 元素
     * @return list
     */
    public static <E> List<E> getLimitList(List<E> list, Integer pageNum, Integer pageSize) {
        if (list == null || list.size() <= 0) {
            return list;
        }
        if (pageNum == null || pageNum < 1) {
            pageNum = 1;
        }
        if (pageSize == null || pageSize < 0) {
            pageSize = 10;
        }
        return list.stream().skip((pageNum - 1) * pageSize).limit(pageSize).collect(Collectors.toList());
    }

三 使用mybatis-plus的Join类的last方法追加limit来分页

这种情况需要写两条查询,一条查总数,一条查分页数据

这里使用了Integer.valueOf(),是为了防止sql注入。 如果不能转换成Integer类型,就会报错,不会执行下面的sql

	// 查询总条数
	int total = 你的Service.count(new QueryWrapper<你的实体类>().lambda()
					你的条件
        );
        
    // 查询分页数据
	Integer limitLeft = (Integer.valueOf(pageNum) - 1) * Integer.valueOf(pageSize);
    List<你的实体类> list = 你的Service
            .list(new QueryWrapper<你的实体类>().lambda()
                    你的条件
                    .last("limit " + limitLeft + "," + pageSize)
            );

如果还不懂,欢迎评论区留言

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/116378.html

(0)

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!