JavaWeb(苍穹外卖)--学习笔记15(分页查询PageHelper)
前言
终于开始学习做项目了,本篇文章是学习B站黑马程序员苍穹外卖的学习笔记📑。我的学习路线是Java基础语法-JavaWeb-做项目,管理端的功能学习完之后,就进入到了用户端微信小程序的开发,这篇文章来看看分页查询,其实在项目中分页查询的实现用的都是PageHelper实现的,我为了复习把原始方法基础实现也写写(●’◡’●),把两者两相对比方便理解
下面还是以一个简单的功能来看看分页查询
✌️先看看接口文档(之前一直没看过接口文档,接口文档开发是一定要会看的),它不会直接告诉你要进行分页查询,而是要看请求参数
一定要注意请求方法,请求路径,请求参数,返回值,根据这些来写controller层代码。
🙌想进行分页查询,我们还要了解数据库语言,使用LIMIT关键字,格式为:limit 开始索引 每页显示的条数。
第一页,显示10条数据:
select * from emp limit 0,10;
原始方式(后端代码实现)
还是先看一下前端的页面了解我们要实现的功能:
这里以一个员工管理分页查询员工的功能为例子
@Data
@NoArgsConstructor
@AllArgsConstructor
public class PageResult {private Long total; //总记录数private List rows; //当前页数据列表
}
1). EmpController
@Slf4j
@RequestMapping("/emps")
@RestController
public class EmpController {@Autowiredprivate EmpService empService;@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page ,@RequestParam(defaultValue = "10") Integer pageSize){log.info("查询员工信息, page={}, pageSize={}", page, pageSize);PageResult pageResult = empService.page(page, pageSize);return Result.success(pageBean);}}
2). EmpService
public interface EmpService {/*** 分页查询* @param page 页码* @param pageSize 每页记录数*/PageResult page(Integer page, Integer pageSize);
}
3). EmpServiceImpl
@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic PageResult page(Integer page, Integer pageSize) {//1. 获取总记录数Long total = empMapper.count();//2. 获取结果列表Integer start = (page - 1) * pageSize;List<Emp> empList = empMapper.list(start, pageSize);//3. 封装结果return new PageResult(total, empList);}
}
4). EmpMapper
@Mapper
public interface EmpMapper {/*** 查询总记录数*/@Select("select count(*) from emp e left join dept d on e.dept_id = d.id ")public Long count();/*** 查询所有的员工及其对应的部门名称*/@Select("select e.*, d.name deptName from emp as e left join dept as d on e.dept_id = d.id limit #{start}, #{pageSize}")public List<Emp> list(Integer start , Integer pageSize);}
PageHelper分页插件
PageHelper是第三方提供的Mybatis框架中的一款功能强大、方便易用的分页插件,支持任何形式的单标、多表的分页查询。
1). 在pom.xml引入依赖
<!--分页插件PageHelper-->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version>
</dependency>
2). EmpMapper
PageHelper实现分页查询之后,只需要编写一条SQL语句,而且不需要考虑分页操作,就是一条正常的查询语句。
/*** 查询所有的员工及其对应的部门名称*/
@Select("select e.*, d.name deptName from emp as e left join dept as d on e.dept_id = d.id")public List<Emp> list();
3). EmpServiceImpl
@Override
public PageResult page(Integer page, Integer pageSize) {//1. 设置分页参数PageHelper.startPage(page,pageSize);//无需手动计算起始索引,直接告诉PageHelper需要查询那一页的数据,每页展示多少条记录即可。//2. 执行查询List<Emp> empList = empMapper.list();Page<Emp> p = (Page<Emp>) empList;//将查询到的总记录数,与数据列表封装到了 Page<Emp> 对象中。//3. 封装结果return new PageResult(p.getTotal(), p.getResult());
}
- PageHelper实现分页查询时,SQL语句的结尾一定一定一定不要加分号;
- PageHelper只会对紧跟在其后的第一条SQL语句进行分页处理。
✨我们可以对比一下,其实使用PageHelper分页插件进行分页是对原始方式的改善
Mapper接口层:
- 原始的分页查询功能中,我们需要在Mapper接口中定义两条SQL语句。
- PageHelper实现分页查询之后,只需要编写一条SQL语句,而且不需要考虑分页操作,就是一条正常的查询语句。
Service层:
- 需要根据页码、每页展示记录数,手动的计算起始索引。
- 无需手动计算起始索引,直接告诉PageHelper需要查询那一页的数据,每页展示多少条记录即可。
小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)
…。。。。。。。。。。。…
…。。。。。。。。。。。…