mybatis数据库分页查询

分页查询的优点

在这里插入图片描述
在这里插入图片描述

PageHelper实现分页查询原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

PageHelper的基本使用

编写持久层

在这里插入图片描述

 	// 分页查询所有订单的方法
    // 适用 PageHelper 框架完成分页查询的原理是在 sql 语句运行时,在 sql 语句后添加 limit 关键字
    // 所以在持久层编写方法时,没有任何分页查询的特征,也无需关注分页业务(注解和 xml 都是)
    @Select("select id, user_id, commodity_code, count, money from order_tbl")
    List<Order> findAllOrders();

在这里插入图片描述

编写业务逻辑层

下面就转到业务逻辑层实现类,先编写一个方法使用PageHelper的功能

先不用写接口,直接在业务逻辑层中写方法

OrderServiceImpl添加方法

// 参数page是页码,pageSize是每页条数
public PageInfo<Order> getAllOrdersByPage(Integer page, Integer pageSize){

    // PageHelper框架实现分页的方法,就是在执行查询之前,设置分页条件
    // 使用PageHelper.startPage方法设置本次查询要查询的页码和每页条数
    // PageHelper的页码从1开始,也就是page是1,就查询第一页
    PageHelper.startPage(page,pageSize);
    // 上面的分页条件设置完毕后,下面进行的查询,就会在sql语句后自动添加limit关键字
    List<Order> list=orderMapper.findAllOrders();
    // 上面的list就是要查询的当页数据,但是不包含分页信息(总页数,总条数,有没有上一页等)
    // 所以作为分页工具,必须返回包含这个分页信息的对象,也就是声明的返回值PageInfo
    // 当前方法返回时,直接实例化PageInfo对象,构造方法中会自动计算分页信息
    // 同时传入list作为参数,将list中的数据赋值给PageInfo
    return new PageInfo<>(list);

}

编写控制层

在这里插入图片描述

	@Autowired
//      ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
private OrderServiceImpl orderService;


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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

附:PageInfo全部分页信息属性

//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的行数量
private int size;
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总页数
private int pages;
//前一页页号
private int prePage;
//下一页页号
private int nextPage;
//是否为第一页
private boolean isFirstPage;
//是否为最后一页
private boolean isLastPage;
//是否有前一页
private boolean hasPreviousPage;
//是否有下一页
private boolean hasNextPage;
//导航条中页码个数
private int navigatePages;
//所有导航条中显示的页号
private int[] navigatepageNums;
//导航条上的第一页页号
private int navigateFirstPage;
//导航条上的最后一页号
private int navigateLastPage;

使用JsonPage返回结果

在这里插入图片描述
在这里插入图片描述

		<!--
            将 PageHelper 框架分页查询结果对象 PageInfo 转换为 JsonPage
            我们需要在commons 模块中添加能够使用 PageInfo 的依赖
        -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.2.0</version>
        </dependency>

在这里插入图片描述

package cn.tedu.csmall.commons.restful;

import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.List;

@Data
public class JsonPage<T> implements Serializable {
    // JsonPage 是用于同一代替 PageInfo 或 Page 这样分页查询结果类型的
    // 其中要包含分页信息和查询到的数据两方面
    // 我们这里只声明少量分页信息即可,实际开发中,有额外需要再添加额外属性
    @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> jsonPage=new JsonPage<>();
        jsonPage.setTotalPages(pageInfo.getPages());
        jsonPage.setTotalCount(pageInfo.getTotal());
        jsonPage.setPage(pageInfo.getPageNum());
        jsonPage.setPageSize(pageInfo.getPageSize());
        // 别忘了分页数据的复制过程
        jsonPage.setList(pageInfo.getList());
        // 最后返回转换完成的对象!
        return jsonPage;
    }
}

在这里插入图片描述

	// 声明返回 JsonPage 类型的分页查询订单的方法
    JsonPage<Order> getAllOrdersByPage(Integer page, Integer pageSize);

csmall-order-webapi项目OrderServiceImpl实现类中进行修改

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

    PageHelper.startPage(pageNum,pageSize);

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

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

业务逻辑层返回值的修改影响控制器方法的调用

再去修改OrderController中方法调用的位置

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

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

保证启动Nacos\Seata

重启order测试

能出现查询结果即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值