有时候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