mysql分页查询
分页查询的优点
所谓分页,就是查询结果数据较多时,采用按页显示的方法,而不是一次性全部显示
分页的优点:
1. 服务器:一次性查询所有信息,服务器压力大,分页查询服务器压力小
2. 客户端:一次性显示所有信息,需要更多流量,加载时间也会更长,分页显示没有这个问题
3. 用户体验上:一般最有价值的信息都会在前几页显示,也方便用户记忆,多查询出来的数据使用几率很低
实现分页查询需要我们开发过程中多几个步骤
PageHelper实现分页查询
我们可以使用sql语句中添加limit关键字的方法实现分页查询
但是查询分页内容时,我们要自己计算相关的分页信息和参数
limit 0,10 limit 10,10
分页逻辑无论什么业务都是类似的,所以有框架帮助我们高效实现分页功能
PageHelper框架可以实现我们提供页码和每页条数,自动实现分页效果,收集分页信息
PageHelper的分页原理就是在程序运行时,在sql语句尾部添加limit关键字,并按照分页信息向limit后追加分页数据
要想使用,首先还是添加依赖
我们在之前搭建的微服务项目中先编写学习,建议使用csmall-order模块
```xml
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
PageHelper的基本使用
先编写持久层
我们使用csmall-order-webapi模块来完成分页的测试
首先编写分页的持久层mapper,持久层功能是全查所有订单信息
// 分页查询所有订单
// PageHelper框架是自动在sql语句后添加limit关键字
// 因为这个特性,我们编写的查询语句,和不分页时是一致的
@Select("select id,user_id,commodity_code,count,money from order_tbl")
List<OrderTb> findAllOrders();
注意这个方法并不需要任何分页的参数或返回值,sql也不需要编写limit
都是在业务逻辑层中由PageHelper框架处理的
编写业务逻辑层
下面就转到业务逻辑层实现类,先编写一个方法使用PageHelper的功能
先不用写接口,直接在业务逻辑层中写方法
// 分页查询所有订单的方法
// pageNum是页码
// pageSize是每页条数
public PageInfo<OrderTb> getAllOrdersByPage(Integer pageNum,Integer pageSize){
// 要想实现PageHelper的分页,首先需要在执行要分页的查询之前
// 设置分页的条件,也就是要查第几页,每页多少条
// 这里的pageNum和SpringData分页不同,1就是第一页 2就是第二页
PageHelper.startPage(pageNum,pageSize);
// 上面设置完成后,下面再运行的查询语句,就会自动按照给定的pageNum,pageSize生成limit之后的sql语句了
List<OrderTb> list= orderMapper.findAllOrders();
// 上面的查询结果就是分页结果,list集合中只有指定页面的数据,并不是全查
// 下面在方法返回时,不能返回List对象,因为还需要返回分页信息
// PageHelper框架提供了PageInfo类型对象,既包含查询到的结果,能包含分页信息(自动计算得来)
return new PageInfo<>(list);
}
ES分页查询
ES分页查询
SpringData框架支持完成分页查询
需要在ItemRepository接口中修改方法的参数和返回值就可以实现
// 分页查询
// 实现分页查询:最后一个参数的位置添加声明类型Pageable的变量
// 返回值修改为Page类型,这个类型的对象不但能够保存查询出的数据,而且还能自动计算出分页信息
// 分页信息中包括:当前页,总页数,总条数,是否有上一页或下一页等
Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
String title, String brand, Pageable pageable);
测试代码如下
// 分页查询
@Test
void queryPage(){
int pageNum= 1; // 页码
int pageSize=2; // 每页条数
Page<Item> page=itemRepository
.queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
"游戏","罗技", PageRequest.of(pageNum-1,pageSize));
page.forEach(item -> System.out.println(item));
// page中除了查询得到数据还包含分页信息
System.out.println("总页数:"+page.getTotalPages());
System.out.println("总条数:"+page.getTotalElements());
System.out.println("当前页:"+page.getNumber());
System.out.println("每页条数:"+page.getSize());
System.out.println("是否为首页:"+page.isFirst());
System.out.println("是否为末页:"+page.isLast());
}