数据库分页查询
分页查询的优点
PageHelper实现分页查询原理
<dependency> <groupId>com.github.pagehelpergroupId> <artifactId>pagehelper-spring-boot-starterartifactId> 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返回结果
<dependency> <groupId>com.github.pagehelpergroupId> <artifactId>pagehelperartifactId> <version>5.2.0version> 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测试
能出现查询结果即可
来源地址:https://blog.csdn.net/weixin_44807758/article/details/130419742