一、PageHelper简介
PageHelper是MyBatis分页插件,支持多种分页场景,如统计总数、支持多种数据库、支持嵌套查询、支持较为复杂的分页查询等。该插件具有易用性高、功能丰富等特点。
二、快速使用
下面给出一个简单的PageHelper使用示例。我们使用PageInfo类来获取分页信息,示例代码如下:
// 引入PageHelper分页插件 import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; // 使用PageHelper分页 PageHelper.startPage(pageNum,pageSize); ListuserList = 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); ListuserList = 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升序排序 ListuserList = userMapper.getUserList(); PageInfo pageInfo = new PageInfo (userList); return pageInfo;
3. 统计查询
使用PageHelper进行统计查询,可以通过PageInfo.getTotal()获取总记录数。示例代码如下:
// 统计查询 PageHelper.startPage(pageNum,pageSize); ListuserList = userMapper.getUserList(); PageInfo pageInfo = new PageInfo (userList); long total = pageInfo.getTotal(); return total;
4. 多表关联查询
多表关联查询,其实就是使用MyBatis的嵌套查询语句实现的,与普通查询使用PageHelper差不多。示例代码如下:
// 多表关联查询 PageHelper.startPage(pageNum,pageSize); ListblogList = 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为查询数量 ListuserList = 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的源代码和文档进行分析和实现。