欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyBatis分页插件PageHelper的具体使用

程序员文章站 2024-02-28 22:07:10
mybatis分页插件pagehelper 如果你也在用 mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。...

mybatis分页插件pagehelper

如果你也在用 mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。

MyBatis分页插件PageHelper的具体使用

pagehelper是一个mybatis的分页插件, 负责将已经写好的sql语句, 进行分页加工.

pagehelper的使用

优点:无需你自己去封装以及关心sql分页等问题,使用很方便,前端取数据也很方便。

1.引入pagehelper依赖

<dependency>
  <groupid>com.github.pagehelper</groupid>
  <artifactid>pagehelper</artifactid>
  <version>5.1.2<ersion>
</dependency>

2.配置applicationcontext.xml文件

在spring的sqlsessionfactorybean中增加一个分页拦截器属性
<bean id="sqlsessionfactory" class="org.mybatis.spring.sqlsessionfactorybean">
  <property name="plugins">
        <array>
          <bean class="com.github.pagehelper.pageinterceptor">
            <property name="properties">
              <value>
                <!-- 这里设定你的数据库类型 -->
                helperdialect=mysql
              </value>
            </property>
          </bean>
        </array>
  </property>
</bean>

3.调用pagehelper的方法

在service方法中调用pagehelper的静态方法startpage(注意一定要在实际查询数据库之前调用该方法),传入需要查询的页号和每页大小,返回pagehelper插件提供的pageinfo对象。即可自动完成数据库物理分页,无须在你的sql语句中手工加limit子句

MyBatis分页插件PageHelper的具体使用

4. pageinfo的结构

关于pageinfo的结构请参看源码,这里通过返回的json来展示。根据需要取pageinfo对象的相应属性即可。

MyBatis分页插件PageHelper的具体使用

5.pageinfo类说明

类源码(更多源码去github上查看即可):

public class pageinfo<t> implements serializable {
  private static final long serialversionuid = 1l;
  //当前页
  private int pagenum;
  //每页的数量
  private int pagesize;
  //当前页的数量
  private int size;
 
  //由于startrow和endrow不常用,这里说个具体的用法
  //可以在页面中"显示startrow到endrow 共size条数据"
 
  //当前页面第一个元素在数据库中的行号
  private int startrow;
  //当前页面最后一个元素在数据库中的行号
  private int endrow;
  //总记录数
  private long total;
  //总页数
  private int pages;
  //结果集
  private list<t> list;
 
  //前一页
  private int prepage;
  //下一页
  private int nextpage;
 
  //是否为第一页
  private boolean isfirstpage = false;
  //是否为最后一页
  private boolean islastpage = false;
  //是否有前一页
  private boolean haspreviouspage = false;
  //是否有下一页
  private boolean hasnextpage = false;
  //导航页码数
  private int navigatepages;
  //所有导航页号
  private int[] navigatepagenums;
  //导航条上的第一页
  private int navigatefirstpage;
  //导航条上的最后一页
  private int navigatelastpage;
 
  public pageinfo() {
  }
 
  /**
   * 包装page对象
   *
   * @param list
   */
  public pageinfo(list<t> list) {
    this(list, 8);
  }
 
  /**
   * 包装page对象
   *
   * @param list     page结果
   * @param navigatepages 页码数量
   */
  public pageinfo(list<t> list, int navigatepages) {
    if (list instanceof page) {
      page page = (page) list;
      this.pagenum = page.getpagenum();
      this.pagesize = page.getpagesize();
 
      this.pages = page.getpages();
      this.list = page;
      this.size = page.size();
      this.total = page.gettotal();
      //由于结果是>startrow的,所以实际的需要+1
      if (this.size == 0) {
        this.startrow = 0;
        this.endrow = 0;
      } else {
        this.startrow = page.getstartrow() + 1;
        //计算实际的endrow(最后一页的时候特殊)
        this.endrow = this.startrow - 1 + this.size;
      }
    } else if (list instanceof collection) {
      this.pagenum = 1;
      this.pagesize = list.size();
 
      this.pages = this.pagesize > 0 ? 1 : 0;
      this.list = list;
      this.size = list.size();
      this.total = list.size();
      this.startrow = 0;
      this.endrow = list.size() > 0 ? list.size() - 1 : 0;
    }
    if (list instanceof collection) {
      this.navigatepages = navigatepages;
      //计算导航页
      calcnavigatepagenums();
      //计算前后页,第一页,最后一页
      calcpage();
      //判断页面边界
      judgepageboudary();
    }
  }
 
 
.......
}

这里只列出所有属性和构造方法,那么可以清晰的看到一些属性的含义,一些属性是如何初始化,并且初始化值是怎样的,更多详细情况可以自己去查看源码,都有中文注释

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。