Mybatis分页插件PageHelper使用

旧城等待, 2023-10-05 23:43 81阅读 0赞

PageHelper原理:

PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。内部流程是ThreadLocal中设置了分页参数(pageIndex,pageSize),之后在查询执行的时候,获取当前线程中的分页参数,执行查询的时候通过拦截器在sql语句中添加分页参数,之后实现分页查询,查询结束后在 finally 语句中清除ThreadLocal中的查询参数。

通俗地讲,就是

PageHelper.startPage(int pageNum, int pageSize)相当于开启分页,通过拦截 MySQL 的方式,把查询语句拦截下来加 limit.

所以,该语句应该放在查询语句之前。

因此,整个过程应该是,前端会传过来pageNum和pageSize这两个参数,当点击前端的下一页按钮的时候,这个pageNum会加1,然后重新传到后端,调用后端的接口。后端拿到pageNum和pageSize之后,利用PageHelper.startPage设置分页,这样,在后面的sql语句中不用加 limit了。

注意:只要保证在PageHelper方法调用后紧跟 MyBatis 查询方法,这就是安全的。因为PageHelper在finally代码段中自动清除了ThreadLocal存储的对象。

在代码中使用例子:

1.引入maven依赖

  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper-spring-boot-starter</artifactId>
  4. <version>1.2.10</version>
  5. </dependency>

2.配置文件application.yml

  1. # 分页配置
  2. pagehelper:
  3. helper-dialect: mysql
  4. reasonable: true
  5. support-methods-arguments: true
  6. params: count=countSql

3.使用

FtUserEntity.java

  1. @Data
  2. @TableName("ft_user")
  3. public class FtUserEntity implements Serializable {
  4. private static final long serialVersionUID = 565759124424203805L;
  5. /**
  6. * 主键id
  7. */
  8. @TableId(type = IdType.AUTO)
  9. private Integer id;
  10. /**
  11. * 用户名称
  12. */
  13. private String name;
  14. /**
  15. * 用户年龄
  16. */
  17. private Integer age;
  18. /**
  19. * 用户手机号
  20. */
  21. private String phone;
  22. /**
  23. * 创建时间
  24. */
  25. private Date createTime;
  26. /**
  27. * 更新时间
  28. */
  29. private Date updateTime;
  30. }

UserDao.xml

  1. select * from ft_user

UserService.java

  1. public interface FtUserService extends IService<FtUserEntity> {
  2. List<FtUserEntity> selectAll();
  3. }

UserController.java

  1. public PageInfo<FtUserEntity> selectAll(@RequestParam(value = "pageCount",defaultValue = "1",required = false)int pageCount,
  2. @RequestParam(value = "pageSize",defaultValue = "10",required = false)int pageSize){
  3. PageHelper.startPage(pageCount,pageSize);
  4. try {
  5. List<FtUserEntity> ftUserEntityList = ftUserService.selectAll();
  6. PageInfo<FtUserEntity> pageInfo = new PageInfo<>(ftUserEntityList);
  7. log.info("数据总条数:{}",pageInfo.getTotal());
  8. return pageInfo;
  9. } finally {
  10. PageHelper.clearPage();
  11. }
  12. }

4.测试

第一页:

4212ed1b3061478db21b1bed96b73f6e.png

第二页:

c245b1175435401eb9afb59872dc2346.png

数据库数据:

a37544582a86434e9d58a5e81bc405fb.png

使用常见问题:

1.PageHelper.startPage方法重要提示

只有紧跟在 PageHelper.startPage 方法后的第一个 Mybatis 的查询(Select)方法会被分页。

2.请不要配置多个分页插件

请不要在系统中配置多个分页插件(使用 Spring 时,mybatis-config.xmlSpring<bean> 配置方式,请选择其中一种,不要同时配置多个分页插件)!

3.分页插件不支持带有 for update 语句的分页

对于带有 for update 的 sql,会抛出运行时异常,对于这样的 sql 建议手动分页,毕竟这样的 sql 需要重视。

4.为什么不支持一对一和一对多结果映射的分页查询?

在一对一和一对多时,根据分页条件查询出 100 条数据时,由于一对一和一对多会去重,经过嵌套处理后数据量会减少,因此分页想要获得 100 条数据无法实现。想要支持这种情况可以使用嵌套查询。嵌套查询是要额外执行SQL,主SQL可以得到正确的结果数量,因此可以正常分页。

发表评论

表情:
评论列表 (有 0 条评论,81人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mybatisPageHelper

        最近有个小项目,不和旧系统有关系,所以简单搭建了一个SSM框架。在项目进行中,遇到需要分页显示数据的需求,记得之前接触mybatis框架用的就是插件,很方便,所以这次