【PageHelper实现分页查询】

PageHelper实现分页查询

我们可以使用sql语句中添加limit来实现分页查询
但在查询的时候需要自己计算分页信息和参数
limit(跳过条数,查询条数)
limit 0,10 limit 10,10 …

PageHelper框架可以根据我们提供的页码和每页的条数,自动实现分页效果

原理就是在sql语句尾部添加limit关键字,并按照分页信息向limit后追加分页数据

首先是要添加依赖
我这个依赖是seata分布事务的依赖,需要自行添加seata依赖

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

PageHelper的使用

PageHelper框架是自动在sql语句后添加limit关键字实现的,所以在查询的时候,和不分页时是一样的
不需要任何分页参数或者返回值,sql也不需要编写limit

	// 分页查询所有订单的方法
    // page是页数,pageSize是每页条数
    public PageInfo<Order> getAllOrdersByPage(Integer page,Integer pageSize){
        // PageHelper框架实现分页最核心的代码就是在运行要分页的查询语句之前,通过框架给定的方法设置要分页查询的要求(第几页,每页多少条)
        // 参数page和SpringData框架不同,page为1就是第一页
        PageHelper.startPage(page,pageSize);
        // 上面设置完之后,就会自动在sql语句末尾添加limit关键字,数值按page,pageSize得出
        List<Order> list = orderMapper.findAllOrders();
        // list并不是全部订单,而是按照上面分页的条件查询出的分页数据,若再添加一个list则会全查(PageHelper只管紧随其后的一次查询)
		// 具体的sql语句省略,按照自己的需求即可
        // 在返回时不直接返回list对象,而是返回PageHelper框架提供的PageInfo类型对象
        // 这个类型对象可以在保存list集合的同时,还能自动计算分页信息
        return new PageInfo<>(list);
    }

控制层部分代码如下

@GetMapping("/page")
    @ApiOperation("分页查询所有订单")
    @ApiImplicitParams({
            @ApiImplicitParam(value = "页码",name = "page",example = "1"),
            @ApiImplicitParam(value = "每页条数",name = "pageSize",example = "6")
    })
    public JsonResult<PageInfo<Order>> pageOrders(Integer page,Integer pageSize){
        PageInfo<Order> pageInfo = orderService.getAllOrdersByPage(page,pageSize);
        return JsonResult.ok("查询完成",pageInfo);
    }

使用JsonPage返回结果

当前分页查询返回的类型时PageInfo,若这个类型作为业务逻辑层的返回值时,当该方法作为dubbo生产者对外提供服务时,消费者调用该服务需要使用PageInfo类型对象来接收,那么消费者也需要添加PageHelper依赖,这不合理,所以,设计在另一个模块中添加专门用于返回分页结果的类,代替PageInfo,这样当前项目中的所有分页和类似的操作都可以使用这个类

先定义
// 通用的返回各种类型分页结果的信息类
@Data
public class JsonPage<T> implements Serializable {
    // 根据世纪需求,定义分页信息
    @ApiModelProperty(value = "总页数",name = "totalPages")
    private Integer totalPages;
    @ApiModelProperty(value = "总条数",name = "totalCount")
    private Long totalCount;
    @ApiModelProperty(value = "当前页码",name = "Page")
    private Integer page;
    @ApiModelProperty(value = "每页条数",name = "PageSize")
    private Integer pageSize;

    // 除了分页信息,还有查询出的分页数据
    @ApiModelProperty(value = "分页数据",name = "list")
    private List<T> list;

    // 上面定义了所有分页数据需要的属性
    // 下面可以编写一个将PageInfo类型转换为JsonPage类型的方法
    // 如果需要将其他框架的分页对象转换,再编写一个新的方法即可
    public static <T> JsonPage<T> restPage(PageInfo<T> pageInfo){
        // 将PageInfo中的数据赋值给JsonPage对象
        JsonPage<T> result = new JsonPage<>();
        // 赋值分页信息
        result.setTotalPages(pageInfo.getPages());
        result.setTotalCount(pageInfo.getTotal());
        result.setPage(pageInfo.getPageNum());
        result.setPageSize(pageInfo.getPageSize());
        // 赋值分页数据
        result.setList(pageInfo.getList());
        // 返回数据
        return result;
    }
}
再使用
//返回JsonPage类型的分页查询全部订单方法
    JsonPage<Order> getAllOrdersByPage(Integer page,Integer pageSize);

将之前查询方法的PageInfo改成JsonPage
返回值改成return JsonPage.restPage(new PageInfo<>(list));
再将之前的控制层代码改成如下所示

public JsonResult<JsonPage<Order>> pageOrders(Integer page, Integer pageSize){
        JsonPage<Order> jsonPage = orderService.getAllOrdersByPage(page,pageSize);
        return JsonResult.ok("查询完成",jsonPage);
    }

即所有的PageInfo改成JsonPage即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值