1. 引入PageHelper的依赖jar包
- PageHelper 的下载地址: pagehelper-xyz.jar
- jsqlparser 的下载地址:jsqlparser-xyz.jar
2. 配置PageHelper
在 Spring 核心配置文件 application.xml 中,配置 org.mybatis.spring.SqlSessionFactoryBean 时添加属性:
<!--创建一个生产sqlSession的工厂对象-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--导入数据源-->
<property name="dataSource" ref="dataSource"/>
<!-- 传入PageHelper 分页插件 -->
<property name="plugins">
<array>
<!-- 传入插件的对象 -->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<!--数据库类型-->
<prop key="helperDialect">oracle</prop>
<!--页码超出范围自动修正-->
<prop key="reasonable">true</prop>
</props>
</property>
</bean>
</array>
</property>
</bean>
3. PageHelper 常用类信息
在使用 PageHelper 时,有3个主要使用的类需要了解:
-
Page 分页对象
继承 ArrayList,对查询结果进行进一步的封装处理
主要属性:
pageNum : 起始页码
pageSize : 每页显示条数
startRow : 起始行
endRow : 结束行
total : 总记录数
pages : 总页数
reasonable : 分页合理化,布尔值,是否对超出范围的页码自动优化处理
-
PageHelper 通用分页拦截器
拦截查询方法,对其进行分页相关的增强
常用方法:
Page < E > startPage(int pageNum,int pageSize):根据起始页和每页条数查询,返回一个Page结果集
Page < E > offsetPage(int offset,int limit):根据起始索引和查询条数查询,返回一个Page结果集
-
PageInfo 响应给前端的分页对象
对Page结果进行包装
主要属性:
pageNum : 当前页
pageSize : 每页的数量
size : 当前页的数量(最后一页不足每页条数)
startRow : 当前页面第一个元素在数据库中的行号
endRow : 当前页面最后一个元素在数据库中的行号
pages : 总页数
prePage: 上一页的页码
nextPage: 下一页的页码
构造方法:
public PageInfo(List list) {
this(list, 8);
}
4. PageHelper 使用步骤
在调用dao层方法前,先执行startPage()或offsetPage()方法
@Service("odersService")
public class OrdersServiceImpl implements IOrdersService {
@Autowired
private IOrdersDao iOrdersDao;
@Override
public List<Orders> findAll(int page, int size) {
//开启分页插件拦截器
PageHelper.startPage(page, size);
return iOrdersDao.findAll();
}
}
将返回的分页信息通过 PageInfo 的构造方法进行封装(Page是ArrayList的子类)
@Controller
@RequestMapping("/orders")
public class OrdersController {
@Autowired
private IOrdersService odersService;
@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(name = "pageNum", defaultValue = "1") int page, @RequestParam(name = "pageSize", defaultValue = "4") int size) {
ModelAndView mv = new ModelAndView();
List<Orders> odersList = odersService.findAll(page, size);
//封装结果集
PageInfo pageInfo = new PageInfo(odersList);
mv.addObject("pageInfo", pageInfo);
mv.setViewName("orders-list");
return mv;
}
}
只需要查询最简单的 “select * from orders” 语句,PageHelper将会自动调用count()方法,获取总记录数,计算出总页数等,并对结果集进行封装
5. PageHelper 使用的注意点
1. 只有紧跟在 PageHelper.startPage 方法后的第一个 Mybatis 的查询(Select)方法会被分页。
2. 不能同时配置多个分页插件
3. 分页插件不支持带有 for update 语句的分页,需要手动分页
4. 不支持一对一和一对多结果映射的分页查询,如果分页显示20条数据,这20条数据中每一个包含30条子数据,则子数据只能显示20条,其余会丢失。