逻辑分页--物理分页

一、物理分页与逻辑分页概念

1.物理分页:物理分页依赖数据库,比如MySQL数据库提供的"limit"关键字,只需编写带有"limit"关键字的SQL语句,数据库返回的就是分页结果。

2.逻辑分页:逻辑分页依赖编码。数据库返回全部数据而并非分页数据,然后再通过编写代码获取分页结果;常用的方法就将查询的结果存放到List集合中,由于List是有序的,可通过索引获取相应的值。

二、物理分页与逻辑分页的对比

1.数据库分担:物理分页每次都需要访问数据库,逻辑分页只需访问一次数据库,因此,物理分页对于数据库造成的负担大;

2.服务器分担:逻辑分页一次性将数据读取到内存,占用了较大的内存空间;物理分页可以每次只读取部分数据,占用内存空间较少;

3.实时性:逻辑分页一次性读取所有数据,若数据库中的数据发生更改,逻辑分页无法实时更新,因此实时性较差;物理分页每次都需要访问数据库,能获取数据库中数据的最新状态,实时性较强;

4.适用场合:逻辑分页主要适用于数据量不大,数据较为稳定的情况;物理分页适用于数据量较大,数据更新频繁的情况。

三、物理分页与逻辑分页的实现

1.物理分页:对于物理分页,目前都有较好的插件可以实现,比如 Mybatis-Plus分页插件、PageHelper等

2.逻辑分页:对于逻辑分页可以利用List集合实现,以下附上逻辑分页的代码:

package com.logic.page.listlogicpage.util;

import lombok.Data;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * <pre>描述</pre>
 * 逻辑分页实体类
 *
 * @version 1.0
 * @author: Kyle
 * @date: 2020/1/13 11:33
 */
@Data
public class PageList<T> {

    /**
     * 当前页
     */
    private Integer current;
    /**
     * 总记录数
     */
    private Integer totalCount;
    /**
     * 总页数
     */
    private Integer sumPages;
    /**
     * 页面记录数
     */
    private Integer pageSize;
    /**
     * 判断是不是首页
     */
    private Boolean isFirstPage = false;
    /**
     * 判断是不是最后一页
     */
    private Boolean isLastPage = false;
    private List<T> list;
    int startIndex = 0;
    int endIndex = 0;
    public PageList(List<T> list, Integer current, Integer pageSize) {
        this.current = current;
        this.pageSize = pageSize;
        this.totalCount = list.size();
        // 计算总页数
        boolean isFullPages = totalCount % pageSize == 0;
        if (!isFullPages) {
            // 若当前数据总数与页面数据大小相除不为整数,则增加一页显示剩余的数据
            this.sumPages = totalCount / pageSize + 1;
        } else {
            this.sumPages = totalCount / pageSize;
        }
        startIndex = current * pageSize - pageSize;
        if (current <= 0) {
            // 若查询的页数是小于等于0的则直接取第一页
           this.startIndex = 0;
           this.current = 1;
           endIndex = this.current * pageSize;
            // throw new ArithmeticException("当前页无法查询");
        } else if (current > sumPages) {
            // 若查询的页数大于总页数,则置list为空
            list = new ArrayList<>();
        } else if (current.equals(sumPages)) {
            endIndex = totalCount;
        } else {
            endIndex = current * pageSize;
        }

        // 判断是否为首页
        if (this.current == 1) {
            isFirstPage = true;
        }

        // 判断是否为最后一页
        if (this.current.equals(sumPages)) {
            isLastPage = true;
        }

        if (CollectionUtils.isEmpty(list)) {
            this.list = new ArrayList<>();
        } else {
            this.list = list.subList(startIndex, endIndex);
        }
    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值