PageHelper实现分页原理

com.github.pagehelper.PageHelper是一个开源的分页源码工具; 第一次看的时候不知道分页原理是什么?

看代码:

    @Override
    public ResultUtil selLogList(Integer page, Integer limit,UserSearch search) {
        PageHelper.startPage(page, limit);
        TbLogExample example=new TbLogExample();
        //设置按创建时间降序排序
        example.setOrderByClause("id DESC");
        Criteria criteria = example.createCriteria();

        if(search.getOperation()!=null&&!"".equals(search.getOperation())){
            criteria.andOperationLike("%"+search.getOperation()+"%");
        }

        if(search.getCreateTimeStart()!=null&&!"".equals(search.getCreateTimeStart())){
            criteria.andCreateTimeGreaterThanOrEqualTo(MyUtil.getDateByString(search.getCreateTimeStart()));
        }
        if(search.getCreateTimeEnd()!=null&&!"".equals(search.getCreateTimeEnd())){
            criteria.andCreateTimeLessThanOrEqualTo(MyUtil.getDateByString(search.getCreateTimeEnd()));
        }

        List<TbLog> logs = tbLogMapper.selectByExample(example);
        PageInfo<TbLog> pageInfo = new PageInfo<TbLog>(logs);
        ResultUtil resultUtil = new ResultUtil();
        resultUtil.setCode(0);
        resultUtil.setCount(pageInfo.getTotal());
        resultUtil.setData(pageInfo.getList());
        return resultUtil;
    }

在dao层调用selectByExample之前只使用了

PageHelper.startPage(page, limit);进行分页。

在这两者之间似乎并没有什么重要的关联,没有相互引用。

再看mybatis的xml文件。

  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.hfcx.pojo.TbLogExample" >
    select
    <if test="distinct" >
      distinct
    </if>
    <include refid="Base_Column_List" />
    from tb_log
    <if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null" >
      order by ${orderByClause}
    </if>
  </select>

一般来说limit是写在order by之后的,可是xml文件中并没有limit。

这时我们看一下PageHelper.startPage(page, limit);的源码;

    /**
     * 开始分页
     *
     * @param pageNum      页码
     * @param pageSize     每页显示数量
     * @param count        是否进行count查询
     * @param reasonable   分页合理化,null时用默认配置
     * @param pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置
     */
    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
        Page<E> page = new Page<E>(pageNum, pageSize, count);
        page.setReasonable(reasonable);
        page.setPageSizeZero(pageSizeZero);
        //当已经执行过orderBy的时候
        Page<E> oldPage = SqlUtil.getLocalPage();
        if (oldPage != null && oldPage.isOrderByOnly()) {
            page.setOrderBy(oldPage.getOrderBy());
        }
        SqlUtil.setLocalPage(page);
        return page;
    }

在这段代码中方法内第一行是写入参数,第二个和第三个都是为null,不去考虑。

重点在于SqlUtil.getLocalPage();和SqlUtil.setLocalPage(page);方法。

这里是使用进行分页的,继续进去看源代码;

    /**
     * 获取Page参数
     *
     * @return
     */
    public static <T> Page<T> getLocalPage() {
        return LOCAL_PAGE.get();
    }

    public static void setLocalPage(Page page) {
        LOCAL_PAGE.set(page);
    }

这里有一个LOCAL_PAGE;

这里用到了一个ThreadLocal;

ThreadLocal,很多地方叫做线程本地变量,也有些地方叫做线程本地存储,其实意思差不多。

ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

原文地址:https://www.cnblogs.com/zhengyuanyuan/p/10767408.html

时间: 2024-08-23 23:44:42

PageHelper实现分页原理的相关文章

php分页原理

一.php分页流程 新手最好在设计先画流程图 二.代码实现 <meta http-equiv="Content-Type" content="text/html;charset=utf8"/> <?php if (isset($_GET['page'])) //获取url里的page { $page = intval($_GET['page']); } else { $page = 1; //其他情况,都指向第一页 } function _PAGE

转载:分页原理+分页代码+分页类制作

分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解. 一.分页原理:       所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数: 每页多少条记录($PageSize)?       当前是第几页($CurrentPageID)? 现在只要再给我一个结果集,我就可以显示某段特

php分页原理教程及简单实例

<?php //连接数据库 $con = mysql_connect("localhost","root",""); mysql_select_db("xueshengchu",$con); mysql_query("set names utf8"); $pageSize = 5; //每页显示数据条数 $result = mysql_query("select * from stu_msg

分页原理+分页代码+分页类制作

分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解. 一.分页原理:       所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数: 每页多少条记录($PageSize)?       当前是第几页($CurrentPageID)? 现在只要再给我一个结果集,我就可以显示某段特

PHP+MySQL分页原理

1.SQL语句中的limit用法 SELECT * FROM table -- limit   开始位置 , 操作条数  (开始位置从0开始) SELECT * FROM table -- limit   0 , 20   (取前面20条) SELECT * FROM table -- limit   10 , 20   (从11开始取20条) 2.学习分页的一种公式 (1)分页原理 所谓分页显示,也就是讲数据库中的结果集,一段一段显示出来 (2)需要的条件 怎么分段,当前在第几段 (每页有几条

Mybatis最入门---分页查询(拦截器分页原理及实现)

[一步是咫尺,一步即天涯] 前文,我们演示了物理分页的Sql实现方式,这种方式使得我们每次在编写查询服务时,不断的重复造轮子.这样的代码实现方式就显得十分的笨拙了.本文是Mybatis分页查询的最后一片内容,我们将介绍基于拦截器的,精巧的实现方式.在阅读这篇文章之前,强烈建议各位看官能够先阅读上文.这样就能对下文我们提及的各种对象及他们之间的关系有一个清晰的关系.好了,废话不多讲,开始我们的正文部分吧. 准备工作: a.操作系统 :win7 x64 b.基本软件:MySQL,Mybatis,SQ

php 分页原理+分页代码+分页类制作

分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初学者来说,常常对这个问题摸不着头绪,因此特地撰写此文对这个问题进行详细的讲解. 一.分页原理:       所谓分页显示,也就是将数据库中的结果集人为的分成一段一段的来显示,这里需要两个初始的参数: 每页多少条记录($PageSize)?       当前是第几页($CurrentPageID)? 现在只要再给我一个结果集,我就可以显示某段特

Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示

关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了SpringBoot如何集成Mybatis和Pagehelper,但是没有做出实际的范例,本篇博客是连接上一篇写的.通过AdminLTE前端框架,利用DataTable和PageHelper进行分页显示,通过对用户列表的增删改查操作,演示DataTable和PageHelper的使用. (1)Admi

PageHelper实现分页

PageHelper实现分页 如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件.分页插件支持任何复杂的单表.多表分页.--PageHelper官网. 后端实现 ? 引入依赖 使用PageHelper之前,我们要先引入其依赖文件,或者jar包.这里使用maven项目演示,所以需要先引入依赖文件. <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pa