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

com.github.pagehelperpagehelper-spring-boot-starter1.2.10

2.配置文件application.yml

# 分页配置
pagehelper:helper-dialect: mysqlreasonable: truesupport-methods-arguments: trueparams: 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 {List selectAll();
}

UserController.java

public PageInfo 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 ftUserEntityList = ftUserService.selectAll();PageInfo 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 配置方式,请选择其中一种,不要同时配置多个分页插件)!

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

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

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

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部