Mybatis分页框架(插件)——PageHelper

1.PageHelper简述 

MyBatis 分页插件 PageHelper 如果你也在用 MyBatis,建议尝试该分页插件,这一定是最方便使用的分页插件。分页插件支持任何复杂的单表、多表分页。icon-default.png?t=M7J4https://pagehelper.github.io/

        以上是PageHelper官网地址和首页的截图,网站上面有详细的官方文档,以及使用步骤等等,不做过多赘述。 我们只需要知道PageHelper是一款非常优秀的Mybatis分页开源框架,它支持十多种主流数据库。

2.使用

         第一步,我们添加maven依赖,因为是Springboot项目,所以没有填写版本号。使用父项目规定依赖版本。

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

         第二步,编写对应查询的持久层

// 分页查询全部订单
// PageHelper框架是自动在sql语句后添加limit关键字实现分页的
// 因为这个特性,我们编写的查询语句,和不分页时是一样的
@Select("select id,user_id,commodity_code,count,money from order_tbl")
List<Order> findAllOrders();

 注意这个方法并不需要任何分页的参数或返回值,sql也不需要编写limit,都是在业务逻辑层中由PageHelper框架处理的。
        第三步,编写业务逻辑层,比较重要的方法就是在将要分页的查询业务逻辑之前,调用PageHelper的startPage(page,pageSize)方法,注意这里page起始页就是1,并不是0

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

    return new PageInfo<>(list);
}

         其中的PageInfo<T>是框架内部的一个类,我们来看下源码:

         源码内容较多,不全部贴出来了。其中比较重要的就是内部定义的这些变量,以及最后这个构造方法,我们可以看出PageHelper框架提供的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);

}

 一旦我们使用了PageHelper框架,sql语句中会自动添加limit关键字。

 3.补充——使用JsonPage返回结果

        当前我们分页查询返回的类型是PageInfo,微服务中,如果用这个类型来做业务逻辑层的返回值,如果当前方法作为dubbo生产者对外提供服务时,消费者调用该服务需要使用PageInfo类型对象来接收,这样要求消费者也添加PageHepler依赖,这是不合理的入侵行为,因为消费者不一定需要框架的功能,也不一定可以执行这一操作。所以我们设计在commons(通用)模块中,添加一个专门用于返回分页结果的类JsonPage,代替PageInfo。这样在微服务项目中,所有分页或类似的操作,就都可以使用这个类了。例如:比较流行的SpringDataElasticsearch框架也支持分页,返回类型为Page,它也可以替换为JsonPage
 

@Data
public class JsonPage<T> implements Serializable {

    // 根据实际需求,定义需要的分页信息
    // 实际开发中可能较多,我们这里就声明4个基本的
    @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类型的方法
    // 如果需要将其它框架的分页对象转换,例如SpringData的Page类,那么就再编写新的方法即可
    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);

对应业务实现类 

//     ↓↓↓↓↓↓↓↓
public JsonPage<OrderTb> getAllOrdersByPage(Integer pageNum, Integer pageSize){

    PageHelper.startPage(pageNum,pageSize);

    List<OrderTb> list= orderMapper.findAllOrders();

    //     ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    return JsonPage.restPage(new PageInfo<>(list));
}

对应控制器层
 

@Autowired
//      ↓↓↓↓↓↓↓↓↓↓↓↓
private IOrderService orderService;

//...
//                ↓↓↓↓↓↓↓↓
public JsonResult<JsonPage<Order>> pageOrders(Integer pageNum, Integer pageSize){
      // 分页调用
      //↓↓↓↓↓↓        ↓↓↓↓↓↓↓↓↓  
      JsonPage<Order> jsonPage=orderService.getAllOrdersByPage(
          pageNum,pageSize);
      //                            ↓↓↓↓↓↓↓↓↓↓
      return JsonResult.ok("查询完成",jsonPage);

猜你喜欢

转载自blog.csdn.net/Lee_92/article/details/126623017
今日推荐