您的位置:

PageHelper用法详解

一、PageHelper简介

PageHelper是MyBatis分页插件,支持多种分页场景,如统计总数、支持多种数据库、支持嵌套查询、支持较为复杂的分页查询等。该插件具有易用性高、功能丰富等特点。

二、快速使用

下面给出一个简单的PageHelper使用示例。我们使用PageInfo类来获取分页信息,示例代码如下:

// 引入PageHelper分页插件
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

// 使用PageHelper分页
PageHelper.startPage(pageNum,pageSize);
List userList = userMapper.getUserList();
PageInfo
    pageInfo = new PageInfo
    (userList);

    
   
  

其中,pageNum表示当前页码,pageSize表示每页显示数量,PageHelper.startPage(pageNum,pageSize)表示开启分页功能,userList为查询到的结果集,PageInfo 为结果集的包装类。

三、常用方法

1. 分页查询

使用PageHelper分页,需要使用PageHelper.startPage(pageNum,pageSize)开启分页功能,pageNum表示当前页码,pageSize表示每页显示数量。示例代码如下:

// 分页查询
PageHelper.startPage(pageNum,pageSize);
List userList = userMapper.getUserList();
PageInfo
    pageInfo = new PageInfo
    (userList);

return pageInfo;

    
   
  

2. 排序查询

使用PageHelper进行排序查询,可以在调用PageHelper.startPage(pageNum,pageSize)方法后,通过PageHelper.orderBy(orderBy)指定排序条件。其中,orderBy表示排序条件,示例代码如下:

// 排序查询
PageHelper.startPage(pageNum,pageSize);
PageHelper.orderBy("id asc"); // 按照id升序排序
List userList = userMapper.getUserList();
PageInfo
    pageInfo = new PageInfo
    (userList);

return pageInfo;

    
   
  

3. 统计查询

使用PageHelper进行统计查询,可以通过PageInfo.getTotal()获取总记录数。示例代码如下:

// 统计查询
PageHelper.startPage(pageNum,pageSize);
List userList = userMapper.getUserList();
PageInfo
    pageInfo = new PageInfo
    (userList);
long total = pageInfo.getTotal();

return total;

    
   
  

4. 多表关联查询

多表关联查询,其实就是使用MyBatis的嵌套查询语句实现的,与普通查询使用PageHelper差不多。示例代码如下:

// 多表关联查询
PageHelper.startPage(pageNum,pageSize);
List blogList = blogMapper.getBlogList();
PageInfo
    pageInfo = new PageInfo
    (blogList);

return pageInfo;

    
   
  

四、分页插件高级用法

1. 物理分页

PageHelper默认使用的是内存分页,即将查询到的数据全部放到内存中进行分页,适用于数据源不大的场景。而在数据量较大的情况下,我们需要使用物理分页方式,即只查询当前页的数据。

使用物理分页方式,需要导入独立的分页插件,示例代码如下:

// 引入物理分页插件
import com.github.pagehelper.PageRowBounds;

// 物理分页
int offset = (pageNum-1)*pageSize;
int limit = pageSize;
PageRowBounds rowBounds = new PageRowBounds(offset,limit); // offset为偏移量,limit为查询数量
List userList = userMapper.getUserList(rowBounds);
PageInfo
    pageInfo = new PageInfo
    (userList);

return pageInfo;

    
   
  

2. 自定义方言

PageHelper支持多种数据库,同时也支持自定义SQL语句方言,以支持更多的数据库类型。

使用自定义方言,需要导入对应的数据库依赖,并在配置文件中指定方言类型。示例代码如下:

// 引入自定义方言
import com.github.pagehelper.dialect.helper.MySqlDialect;

// 自定义方言
PageHelper.startPage(1,10);
PageHelper.clearPage(); // 清除页面设置
PageHelper.setSqlDialect(new MySqlDialect()); // 设置MySql方言

return userMapper.selectUserList();

3. 自定义分页插件

PageHelper提供了一个统一的拦截器接口,可以方便的自定义分页插件,以满足更加特殊的分页需求。

使用自定义分页插件,需要实现Interceptor接口,并在配置文件中指定该拦截器。示例代码如下:

// 引入自定义分页插件
import com.github.pagehelper.PageInterceptor;

// 自定义分页插件
Properties props = new Properties();
props.setProperty("dialect", "mysql"); // 设置数据库类型
PageInterceptor interceptor = new PageInterceptor();
interceptor.setProperties(props);

// 在配置文件中指定自定义分页插件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath:mapper/**/*.xml"/>
    <property name="plugins">
        <list>
            <!-- 自定义分页插件 -->
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <value>dialect=mysql</value>
                </property>
            </bean>
        </list>
    </property>
</bean>

4. 定制化分页组件

PageHelper提供了一种可扩展机制,我们可以实现自己的分页组件,并在配置文件中指定该组件。这种方式需要我们熟悉PageHelper内部的架构和设计,并有一定的实战经验。

示例代码就不再给出,读者可以通过参考PageHelper的源代码和文档进行分析和实现。