springboot使用pageHelper实现分页(一)

概述

业务中查询数据库,对数据分页是必不可少的,但是传统的分页功能必须自己手动实现,还得多写一条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));

参考

官方文档
Springboot Mybatis使用pageHelper实现分页查询

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

融极

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值