PageHelper是第三方提供的Mybatis框架中的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。
官网:https://pagehelper.github.io/
依赖
1 2 3 4 5 6
| <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.7</version> </dependency>
|
无插件下的分页查询操作
Service层
1 2 3 4 5 6 7 8 9 10 11
| @Override
public pageResult<Emp> page(Integer page, Integer pageSize) { Long count = empMapper.count(); List<Emp> list = empMapper.list((page - 1) * pageSize, pageSize); return new pageResult<Emp>(count, list); }
|
Mapper层
1 2 3 4 5 6 7 8 9 10
| @Select("select count(*) from emp e left join dept d on e.dept_id = d.id") public Long count();
@Select("select e.* , d.name deptName " + "from emp e left join dept d on e.dept_id = d.id " + "order by e.update_time desc " + "limit #{start}, #{pageSize}") public List<Emp> list(Integer start, Integer pageSize);
|
PageHelper插件优化
Service层
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Override public PageResult page(Integer page, Integer pageSize) { PageHelper.startPage(page,pageSize);
List<Emp> empList = empMapper.list(); Page<Emp> p = (Page<Emp>) empList;
return new PageResult(p.getTotal(), p.getResult()); }
|
Mapper层
1 2 3
| @Select("select e.*, d.name deptName " + "from emp as e left join dept as d on e.dept_id = d.id") public List<Emp> list();
|
实现原理
引用PageHelper插件后只需在Mapper层声明一个查询所需属性的SELECT语句即可,在运行时,该插件会自动注入SQL语句
PageHelper在进行分页查询时,会执行上述图片中两条SQL语句,并将查询到的总记录数,与数据列表封装到了 Page<Emp> 对象中,我们再获取查询结果时,只需要调用Page对象的方法就可以获取。
注意事项
PageHelper实现分页查询时,SQL语句的结尾一定一定一定不要加分号(;).。
PageHelper只会对紧跟在其后的第一条SQL语句进行分页处理。
若在Service方法中多写一条SQL语句 则会原样输出
因为调用的Mapper层中的SQL语句原本是查整个表的数据 所以第二个查询操作只会原样输出整个表的数据