**需求分析和设计**
业务规则:
根据页码展示菜品信息
每页展示10条数据
分页查询时可以根据需要输入菜品名称、菜品分类、菜品状态进行查询
根据菜品分页查询接口定义设计对应的VO DishVO
关于菜品分页查询,因为传进去的参数是Query类型,而不是Json所以不用@RequestBody
**关于分页查询**
DishVO除了基础属性之外还有一个categoryName
调用方法处理DTO返回VO
好/现在捋一下思路/Dish普通的实体类,DTO比实体类多一个口味的数组而VO有口味数组还有分类名,实体类只是只有分类id
PageResult包含两个属性 总记录数total 和list当前页数据的集合
controller层调用service层分页方法,还返回了一个pageResult用于controller层的成功success返回结果。
调用service层接口,用impl中的方法实现接口,分页查询的插件pagehelper不多说了
层层调度参数为pageQuerydto故只包含必要的page和size菜品名分类id和状态
PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());
传进去参数为dto获得的page当前页数和pagesize每页显示记录数
调用mapper层的分页查询方法(分页dto参数),赋值给每页显示的数据的一个列表Page<DishVO>此时取名变量为page
这个Page列表和ArrayList极其相似,是专为分页定义的分页列表class继承了ArrayList
最后返回值给PageResult传参为total(总记录数)和getResult结果(当前页数据集合)
Controller层代码DishController
```
@GetMapping("/page")
@ApiOperation("菜品分页拆查询")
public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO){
log.info("菜品分页查询{}",dishPageQueryDTO);
PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);
return Result.success(pageResult);
}
```
DishService
```
PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO);
```
DishServiceimpl 第一个参数是页码,在DishPageQueryDTO中有了就是Page
```plaintext
public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {
PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());
Page<DishVO> page = dishMapper.pageQuery(dishPageQueryDTO);
return new PageResult(page.getTotal(), page.getResult());
}
```
数据库查询菜品以及菜品的分类名称返回给VO,传进来的参数是分页PageDTO(不包含菜品分类名称)
使用到左外连接,查询dto全部以及分类表的名字,条件分类菜品的分类id = 分类表的id
这里遇到一个问题,就是查询出来的表有两个name一个是菜品name还一个是分类名称name
就要给字段起别名`select` d.*,c.name as categoryName from dish d `left outer join` category c `on` d.category_id = c.id
写进xml还有一个动态的条件判断,用where标签,然后if条件判断是否为空,因为传进来的参数是dto所以就三个属性判断除了page和pagesize
就判断name,categoryid和status 通过名称来查询菜品
因为根据名称查询,所以一般为模糊查询使用like就不用 =
DishMapper.xml
```
<select id="pageQuery" resultType="com.sky.vo.DishVO">
select d.*,c.name as categoryName from dish d left outer join category c on d.category_id = c.id
<where>
<if test="name != null">
and d.name like concat('%',#{name},'%')
</if>
<if test="categoryId != null">
and d.category_id = #{categoryId}
</if>
<if test="status != null">
and d.status = #{status}
</if>
</where>
order by d.create_time desc
</select>
```