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可以得到正确的结果数量,因此可以正常分页。
还没有评论,来说两句吧...