数据库分页查询

  • 分页查询的优点
  • PageHelper实现分页查询原理
  • PageHelper的基本使用
    • 编写持久层
    • 编写业务逻辑层
    • 编写控制层
  • 使用JsonPage返回结果

分页查询的优点


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中的数据赋值给PageInforeturn 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返回结果


<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;@Datapublic 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测试

能出现查询结果即可