SpringBoot菜品分页查询模块开发(多表连接查询)

需要注意的地方

  1. 为什么创建VO类
  2. 怎么进行多表连接查询
  3. 分页查询的统一返回结果类PageResult
  4. 分页查询Mapper的返回结果是Page<目标实体类>

需求分析与设计

一:产品原型

系统中的菜品数据很多的时候,如果在一个页面中全部展示出来会显得比较乱,不便于查看,所以一般的系统中都会以分页的方式来展示列表数据。

菜品分页原型:

在菜品列表展示时,除了菜品的基本信息(名称、售价、售卖状态、最后操作时间)外,还有两个字段略微特殊,第一个是图片字段 ,我们从数据库查询出来的仅仅是图片的名字,图片要想在表格中回显展示出来,就需要下载这个图片。第二个是菜品分类,这里展示的是分类名称,而不是分类ID,此时我们就需要根据菜品的分类ID,去分类表中查询分类信息,然后在页面展示。(因为菜品表中只存了分类ID)

业务规则:

  • 根据页码展示菜品信息

  • 每页展示10条数据

  • 分页查询时可以根据需要输入菜品名称、菜品分类、菜品状态进行查询

二:接口设计

代码开发

一:设计DTO类

根据请求参数设计DTO

package com.sky.dto;

import lombok.Data;
import java.io.Serializable;

@Data
public class DishPageQueryDTO implements Serializable {

    private int page;
    private int pageSize;
    private String name;
    private Integer categoryId; //分类id
    private Integer status; //状态 0表示禁用 1表示启用

}

二:设计VO类

因为返回的数据无法用一个实体类表示(多了一个属于分类实体的分类名称属性)

所以需要设计VO类:

package com.sky.vo;

import com.sky.entity.DishFlavor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DishVO implements Serializable {

    private Long id;
    //菜品名称
    private String name;
    //菜品分类id
    private Long categoryId;
    //菜品价格
    private BigDecimal price;
    //图片
    private String image;
    //描述信息
    private String description;
    //0 停售 1 起售
    private Integer status;
    //更新时间
    private LocalDateTime updateTime;
    //分类名称
    private String categoryName;
    //菜品关联的口味
    private List<DishFlavor> flavors = new ArrayList<>();
}

 三:Controller层

	/**
     * 菜品分页查询
     *
     * @param dishPageQueryDTO
     * @return
     */
    @GetMapping("/page")
    @ApiOperation("菜品分页查询")
    public Result<PageResult> page(DishPageQueryDTO dishPageQueryDTO) {
        log.info("菜品分页查询:{}", dishPageQueryDTO);
        PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);//后绪步骤定义
        return Result.success(pageResult);
    }

细节:

分页查询统一返回PageResult对象,需要对Result进行泛型规定

四:Service层

	/**
     * 菜品分页查询
     *
     * @param dishPageQueryDTO
     * @return
     */
    public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {
        PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());
        Page<DishVO> page = dishMapper.pageQuery(dishPageQueryDTO);//后绪步骤实现
        return new PageResult(page.getTotal(), page.getResult());
    }

五:Mapper层(多表连接查询)

	/**
     * 菜品分页查询
     *
     * @param dishPageQueryDTO
     * @return
     */
    Page<DishVO> pageQuery(DishPageQueryDTO dishPageQueryDTO);
<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 name != ''">
                and d.name like concat('%',#{name},'%')
            </if>
            <if test="categoryId != null and categoryId != ''">
                and d.category_id = #{categoryId}
            </if>
            <if test="status != null and status != ''">
                and d.status = #{status}
            </if>
        </where>
        order by d.create_time desc
</select>

细节:

select d.* , c.name as categoryName from dish d left outer join category c on d.category_id = c.id

  • c.name as categoryName是为了让查询的返回结果和接收对象Page<DishVO>的属性名保持一致
  • 连接方式:left outer join
  • 连接参考:d.category_id = c.id

相关推荐

  1. springboot查询

    2024-04-11 13:50:04       57 阅读
  2. SpringBoot查询

    2024-04-11 13:50:04       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-11 13:50:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-11 13:50:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-11 13:50:04       87 阅读
  4. Python语言-面向对象

    2024-04-11 13:50:04       96 阅读

热门阅读

  1. python之迭代

    2024-04-11 13:50:04       34 阅读
  2. 七彩之城的独特序列(蓝桥杯)

    2024-04-11 13:50:04       42 阅读
  3. SpringCloudAlibaba-整合gateway(五)

    2024-04-11 13:50:04       38 阅读
  4. opencv使用滑动窗口提取GLCM特征做svm图像分类

    2024-04-11 13:50:04       32 阅读
  5. uniapp实现文件和图片选择上传功能实现

    2024-04-11 13:50:04       35 阅读
  6. Linux 系统如何设置免密登录

    2024-04-11 13:50:04       38 阅读
  7. 山东济南教育投稿邮箱与投稿信箱

    2024-04-11 13:50:04       36 阅读
  8. PaddleOCR 图片日期识别

    2024-04-11 13:50:04       34 阅读
  9. Linux 文件比较工具

    2024-04-11 13:50:04       37 阅读