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即可