Mybatis分页插件PageHelper使用

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依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
</dependency>

2.配置文件application.yml

# 分页配置
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countSql

3.使用

FtUserEntity.java

@Data
@TableName("ft_user")
public class FtUserEntity implements Serializable {
    private static final long serialVersionUID = 565759124424203805L;
    /**
     * 主键id
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    /**
     * 用户名称
     */
    private String name;
    /**
     * 用户年龄
     */
    private Integer age;
    /**
     * 用户手机号
     */
    private String phone;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 更新时间
     */
    private Date updateTime;
}

UserDao.xml

select * from ft_user

UserService.java

public interface FtUserService extends IService<FtUserEntity> {
    List<FtUserEntity> selectAll();
}

UserController.java

public PageInfo<FtUserEntity> selectAll(@RequestParam(value = "pageCount",defaultValue = "1",required = false)int pageCount,
                                        @RequestParam(value = "pageSize",defaultValue = "10",required = false)int pageSize){

        PageHelper.startPage(pageCount,pageSize);
        try {
            List<FtUserEntity> ftUserEntityList = ftUserService.selectAll();
            PageInfo<FtUserEntity> pageInfo = new PageInfo<>(ftUserEntityList);
            log.info("数据总条数:{}",pageInfo.getTotal());
            return pageInfo;
        } finally {
            PageHelper.clearPage();
        }
    }

4.测试

第一页:

 第二页:

 数据库数据:

使用常见问题:

1.PageHelper.startPage方法重要提示

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

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

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

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

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

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

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

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值