【仿JFINAL框架】为了提供数据结构的普适性而提出的数据分页工具

提出目的

:这种方法无法体现分页的本质,重写分页算法的目的是为了让分页算法能够普适各种数据类型。即向分页算法中投入任何数据结构都可以进行分页

分页工具类代码

注:本文仅贴出代码,不介绍逻辑。 具体分页逻辑可以自行查看代码进行理解

  • 1.PageMe.java (继承JFinal封装的Page类,是分类方法返回的数据类型。该类使用java泛型类机制,让分类算法普适于任何数据结构)
/**
 * @author cc
 */
public class PageMe<T> extends Page<T> {
    boolean firstPage;

    @Override
    public boolean isFirstPage() {
        return firstPage;
    }

    public void setFirstPage(boolean firstPage) {
        this.firstPage = firstPage;
    }

    @Override
    public boolean isLastPage() {
        return lastPage;
    }

    public void setLastPage(boolean lastPage) {
        this.lastPage = lastPage;
    }

    boolean lastPage;
}
  • 2.PageKit.java (分页工具类,内有分页方法paginate() )
/**
 * @author cc
 */
public class PageKit<T> {
/**
* @return PageMe<T> 
*/
    public PageMe<T> paginate(int pageNumber, int pageSize, List<T> data) {
        PageMe<T> page = new PageMe<>();
        page.setTotalRow(data.size());
        page.setTotalPage(pageSize == 0 ? 1 : (int) Math.ceil((data.size() / pageSize)));
        //基础数据
        if (pageNumber < 1) {
            //如果pageNumber不符合规范,返回全部数据
            page.setList(data);
            return page;
        }
        page.setFirstPage(pageNumber <= 1);
        page.setLastPage(pageNumber == page.getTotalPage());
        page.setPageNumber(pageNumber);
        page.setPageSize(pageSize);
        //根据前端传过来的数据配置
        if (data.size()==0){
            page.setList(Collections.emptyList());
            return page;
        }
        int beginIndex = (pageNumber - 1) * pageSize;
        int endIndex = pageNumber * pageSize;
        endIndex = Math.min(endIndex, data.size());
        beginIndex = Math.min(beginIndex, data.size());
        //case1: beginIndex在范围内,endIndex在范围外
        List<T> renderData;
        if (beginIndex < data.size() && endIndex > data.size()) {
            renderData = data.subList(beginIndex, endIndex);
        } else {
            //case2: beginIndex在范围外
            if (beginIndex >= data.size()) {
                renderData = null;
            } else {
                //case3:取中间数据
                renderData = data.subList(beginIndex, endIndex);
            }
        }

        page.setList(renderData);
        return page;
    }
}

使用方法

注:pageNumber和pageSize一般由前端给,后端负责接受这两个值。这里示例为了方便直接定义

int pageNumber = 1 ; //第一页
int pageSize = 8	;//一页八条数据

List<Record> data; // 一个装着元素类型为Record的List
PageKit<Record> pageKit = new PageKit<>(); // 每一条数据类型为Record
PageMe<Record> data = pageKit.paginate(pageNumber, pageSize, data);

最后直接把data返回给前端即可

适用范围

由于表设计有问题,导致一条sql语句很难将表连接起来,因此无法使用Jfianl自带的分页方法时,可以考虑这种。 本文给出的分页思想是:先将数据库中的数据查出来,并拼接成前端需要的数据类型(如前端需要学生名字,学生班级,语文成绩,但是他们在不同的表中又很难使用一条sql语句进行拼接)。
但是,分页的目的本应是提高查找效率,本文提出的分页没有提高查找效率。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值