概述
业务中查询数据库,对数据分页是必不可少的,但是传统的分页功能必须自己手动实现,还得多写一条sql才能获取数据的总数,这让使用分页功能较为繁琐。
github提供的pageHelper分页插件可以让我们仅仅设置起始页码和分页大小就可以轻松的完成分页功能。
导入pom依赖
导入pagehelper 的springboot启动器。
注意版本号。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>
配置文件添加pagehelper的配置
# page helper 配置
pagehelper:
helper-dialect: mysql
reasonable: false
support-methods-arguments: true
helper-dialect
sql语言辅助器。
配置使用哪种数据库语言,如果不配置,pageHelper也会自动检测。
reasonable
配置分页参数合理化功能,默认是false。
启用合理化配置后,如果pageNum < 1会查询第一页,如果pageNum>总页数会查询最后一页。
禁用合理化配置后,如果pageNum < 1或者pageNum > 总页数会返回空数据。
params
为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据姓名取值;
可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,默认值为:
pageNum=pageNum,pageSize=pageSize,count=countSql,reasonable=reasonable,pageSizeZero=pageSizeZero。
support-methods-arguments
支持通过Mapper接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面的params配置的字段来取值,查找到合适的值就会自动分页。
使用示例
非常简单,只需要在你查询数据的那一句代码前面,写上PageHelper.startPage()方法,传入pageNum(页数)和pageSize(行数)就可以了(写了这个方法,在执行查询语句时,pageHelper会自动拦截查询语句并拼接相关的分页sql);过程如下:
- 通过PageHelper.startPage(1,10),设置起始页码(pageHelper起始页从1开始)和分页大小。
- personOrgRelMapper.selectByExample(queryCondition) 查询数据的时候,pageHelper拦截查询sql并添加limit语句,结果查询前10条数据。
- page.getTotal()获取数据总数 ,pageHelper自动根据之前的查询条件查询数据的总数。
public List<PersonOrgRelEntity> queryPagePerson(BasePageReqDto reqDto) {
Page<PersonOrgRelEntity> page = PageHelper.startPage(1, 10);
// 使用tkmybatis查询数据
Example queryCondition = new Example(PersonOrgRelEntity.class);
queryCondition.orderBy("createTime");
List<PersonOrgRelEntity> relEntityList = personOrgRelMapper.selectByExample(queryCondition);
log.info("rel total count:{}", page.getTotal());
return relEntityList;
}
pageHelper的几种使用方式
//第一种,RowBounds方式的调用
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);
//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);
//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<User> selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);
//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
//其他fields
//下面两个参数名和 params 配置的名字一致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);
//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
@Override
public void doSelect() {
userMapper.selectGroupBy();
}
});
//jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());
//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
@Override
public void doSelect() {
userMapper.selectGroupBy();
}
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());
//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
@Override
public void doSelect() {
userMapper.selectLike(user);
}
});
//lambda
total = PageHelper.count(()->userMapper.selectLike(user));
参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100270.html