分页查询技术

1.传统分页: PageBean

最开始学习的时候是使用PageBean对象封装分页数据的

首先需要对PageBean定义一些属性

然后dao中编写相应的代码查询出分页结果并封装到PageBean中

具体的代码如下

PageBean

package com.j.domain;
import java.util.List;
/**
 * @Author: JunChen
 * @Date: 2020/8/10 15:46
 */
public class PageBean<T> {
    /**
     * 用户选择的当前页码
     */
    private int pageNumber;
    /**
     * 每页展示的个数
     */
    private int pageSize;
    /**
     * 页面展示需要的总页数
     */
    private int totalPage;
    /**
     * 页面需要展示总记录数
     */
    private int totalCount;
    /**
     * 数据库需要的开始索引
     */
    private int startIndex;
    /**
     * 动态条开始页码
     */
    private int start;
    /**
     * 动态条结束页码
     */
    private int end;
    /**
     * 页面需要展示的数据部分
     */
    private List<T> data;


    private void q4h5() {
        if (totalPage < 10) {
            start = 1;
            end = totalPage;
        } else {
            start = pageNumber - 4;
            end = pageNumber + 5;
            //4-4<1,end = 9
            if (start <= 1) {
                start = 1;
                end = 10;
            }
            if (end > totalPage) {
                end = totalPage;
                start = end - 9;
            }
        }
    }

    public PageBean(int pageNumber, int pageSize) {
        /*
        第一页 : limit 0,5
        第二页:  limit 5,5
        第三页:  limit 10,5
        pageNumber: limit startIndex , pageSize
        */
        this.pageNumber = pageNumber;
        this.pageSize = pageSize;
        startIndex = (pageNumber - 1) * pageSize;
    }

    public void setTotalCount(int totalCount) {
        if (totalCount % pageSize == 0) {
            totalPage = totalCount / pageSize;
        } else {
            totalPage = totalCount / pageSize + 1;
        }
        this.totalCount = totalCount;
        q4h5();
    }
    //省略非重要的get set 和toString;
}

2.PageHelper

PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,

例如MySql,oracle等

PageHelper.startPage静态方法调用:

除了 PageHelper.startPage 方法外,还提供了类似用法的 PageHelper.offsetPage 方法。

在你需要进行分页的 MyBatis查询方法前调用PageHelper.startPage静态方法即可,

紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。

PageHelper分页原理

首先,PageHelper将前台传来的参数封装到Page的对象中,

接着将Page的副本存放入ThreadLocal中,这样应该是保证分页的时候,参数互不影响,

接着利用了mybatis提供的拦截器,取得ThreadLocal的值,

PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,

最后再次赋值给下一步操作,就实现了分页。

使用了PageHelper分页之后, 查询的sql语句后面还可不可以加; 为什么?

使用了PageHelper分页之后, 查询的sql语句后面就不可以再加;
因为PageHelper底层是基于拦截器来实现分页的,它会首先拦截到我们编写的查询所有的SQL语句(select * from tableName), 然后再后面拼接limit …实现分页,

类似于这样: select * from tableName limit …
如果此时我们的SQL语句中有; 那么结果就变成了这样:

select * from tableName; limit … 很明显这是一条错误的SQL

PageHelper在使用的时候,如果PageHelper.start()方法在查询列表之后执行, 会出现什么问题?

出现的问题是: 不会实现分页,而是查询到所有数据

因为PageHelper.start()方法是创建一个Page对象,并且设置3个属性初始化Page,然后将Page绑定到当前线程;

而分页方法在执行时会先判断当前线程是否有Page对象, 有才会执行分页, 没有就查询所有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值