SpringBoot删除菜品模块开发(SpringMVC分割参数、事务管理、异常处理、批量删除)

需求分析与设计

一:产品原型

在菜品列表页面,每个菜品后面对应的操作分别为修改删除停售,可通过删除功能完成对菜品及相关的数据进行删除。

删除菜品原型:

业务规则:

  • 可以一次删除一个菜品,也可以批量删除菜品

  • 起售中的菜品不能删除

  • 被套餐关联的菜品不能删除

  • 删除菜品后,关联的口味数据也需要删除掉

二:接口设计

三:数据表设计

在进行删除菜品操作时,会涉及到以下三张表。

注意事项:

  • 在dish表中删除菜品基本数据时,同时,也要把关联在dish_flavor表中的数据一块删除。

  • setmeal_dish表为菜品和套餐关联的中间表。

  • 若删除的菜品数据关联着某个套餐,此时,删除失败。

  • 若要删除套餐关联的菜品数据,先解除两者关联,再对菜品进行删除。

代码开发

一:Controller层

	/*** 菜品批量删除** @param ids* @return*/@DeleteMapping@ApiOperation("菜品批量删除")public Result delete(@RequestParam List<Long> ids) {log.info("菜品批量删除:{}", ids);dishService.deleteBatch(ids);//后绪步骤实现return Result.success();}

细节:

ids的接收其实可以用String类型,,之后用split分割。

但是如果依赖SpringMVC框架帮忙分割更方便(需要在前面加上@RequestParam 注解)

@RequestParam List<Long> ids

二:Service层

    @Autowiredprivate SetmealDishMapper setmealDishMapper;/*** 菜品批量删除** @param ids*/@Transactional//事务public void deleteBatch(List<Long> ids) {//判断当前菜品是否能够删除---是否存在起售中的菜品??for (Long id : ids) {Dish dish = dishMapper.getById(id);//后绪步骤实现if (dish.getStatus() == StatusConstant.ENABLE) {//当前菜品处于起售中,不能删除throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE);}}//判断当前菜品是否能够删除---是否被套餐关联了??List<Long> setmealIds = setmealDishMapper.getSetmealIdsByDishIds(ids);if (setmealIds != null && setmealIds.size() > 0) {//当前菜品被套餐关联了,不能删除throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);}//删除菜品表中的菜品数据for (Long id : ids) {dishMapper.deleteById(id);//后绪步骤实现//删除菜品关联的口味数据dishFlavorMapper.deleteByDishId(id);//后绪步骤实现}}

细节:

  • 因为涉及多表,所以需要使用事务管理
  • 不写死:
    • 是否被禁用不写死:StatusConstant
    • 提示信息也不写死:MessageConstant.DISH_ON_SALE(菜品在起售中)、MessageConstant.DISH_BE_RELATED_BY_SETMEAL(菜品在套餐内)
  • 为了给前端返回错误的提示信息,需要手动抛异常:不能删除异常DeletionNotAllowedException(提示信息)

三:Mapper类

在DishMapper中声明getById方法,并配置SQL:

	/*** 根据主键查询菜品** @param id* @return*/@Select("select * from dish where id = #{id}")Dish getById(Long id);

创建SetmealDishMapper,声明getSetmealIdsByDishIds方法,并在xml文件中编写SQL:

package com.sky.mapper;import com.sky.entity.SetmealDish;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;@Mapper
public interface SetmealDishMapper {/*** 根据菜品id查询对应的套餐id** @param dishIds* @return*///select setmeal_id from setmeal_dish where dish_id in (1,2,3,4)List<Long> getSetmealIdsByDishIds(List<Long> dishIds);
}

细节:

动态体现在in (.....)的....数量不确定,没办法直接写占位符(因为不知道写几个)

SetmealDishMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.SetmealDishMapper"><select id="getSetmealIdsByDishIds" resultType="java.lang.Long">select setmeal_id from setmeal_dish where dish_id in<foreach collection="dishIds" item="dishId" separator="," open="(" close=")">#{dishId}</foreach></select>
</mapper>

细节:

<foreach collection="mapper方法的形参名" item="自己取得元素名" separator="," open="(" close=")">

拼成(1,2,3,4,5)之类的样子

在DishMapper.java中声明deleteById方法并配置SQL:

	/*** 根据主键删除菜品数据** @param id*/@Delete("delete from dish where id = #{id}")void deleteById(Long id);

在DishFlavorMapper中声明deleteByDishId方法并配置SQL:

    /*** 根据菜品id删除对应的口味数据* @param dishId*/@Delete("delete from dish_flavor where dish_id = #{dishId}")void deleteByDishId(Long dishId);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【proteus仿真】定时器0中断实验

#include <REGX51.H> sbit LED1P2^0; void delay(unsigned int ten_s) {while(ten_s--); } void inittime0(void) {TMOD0x01;//选择为定时器0模式&#xff0c;工作方式1TH00xFC;//初值65536-100064536FC18H,定时1msTL00x18;ET01;//打开定时器0中断允许EA1;//打开总中断TR…

取消请求实战

关于前端取消请求&#xff0c;大多数文章都是new AbortController() 然后将signal放到请求中&#xff0c;然后执行abort取消&#xff0c;这种文章怎么好意思拿出来啊&#xff0c;mmmmini版的官方文档罢了。 首先要明确我们想要的效果是什么&#xff0c;可以对比一下toast.show…

InternLM2 技术报告——社区翻译版

InternLM2技术报告于近日正式对外发布&#xff0c;不少社区大佬自发地参与到报告的翻译与解读中来。本文为社区用户翻译的InternLM2技术报告原文&#xff0c;分享给大家~ 论文地址&#xff1a; https://arxiv.org/pdf/2403.17297.pdf 摘要 大型语言模型&#xff08;LLMs&…

红队内网攻防渗透:内网渗透之内网和域信息收集

红队内网攻防渗透 1.内网渗透之信息收集1.内网信息收集的目的2.本机信息收集网络配置查询操作系统及版本信息查看系统体系结构查看安装的软件及版本、路径等查询本机服务查询进程列表查毒软件查看启动程序信息查看计划任务查看主机开机时间查询用户列表获取本地管理员查看当前在…

unity的引用传递和数组的联系

引用传递 //引用传递 static void SetY(out int x,out int y ){x 0;y 0;x 1000;}static void Main(string[] args){int x 0;int y 10;SetY(out x, out y);Console.WriteLine($"x{x},y{y}");} 结果是&#xff1a;x1000&#xff0c;y0 数组的引用传递 数组值…

Linux 创建命令

在学习linux操作系统时,一般从最基本的cd、pwd命令,到常用命令mkdir、cat、df等,再到高级命令sed、awk、nmcli、crontab等,学习linux时会遇到大量命令。当我们不会使用时,可以借助man、info、--help等,查看如何使用,从中学习选项、参数等设置方法。 当进一步学习bash编…

Java基础常见面试总结

文章目录 1. 变量、数据类型转换、运算符1.1 变量1.2 数据类型转换1.2.1强转的注意事项 1.3 进制的转换1.4 位运算符1.5 运算符1.6 三元运算符 2. 流程控制2.1 键盘录入_Scanner2.2 Random随机数2.3 switch(选择语句)2.4 分支语句2.5 循环语句 3. 数组3.1 数组的定义3.2 数组操…

LeetCode热题100

一丶哈希 1、两数之和 方法一&#xff08;自己想到&#xff09;&#xff1a;暴力枚举&#xff0c;两次循环遍历所有相加的情况 class Solution {public int[] twoSum(int[] nums, int target) {for(int i0;i<nums.length;i){for(int ji1;j<nums.length;j){if(nums[i]nu…

证件照小于30kb怎么弄?这个工具三步搞定

当我们需要将照片上传到各种平台时&#xff0c;常常会遇到图片文件大小限制的问题。无论是社交媒体平台还是工作需求&#xff0c;如果照片文件过大&#xff0c;系统会提示上传失败或无法上传。想要解决的这个问题&#xff0c;可以选择将图片压缩指定大小&#xff0c;比如图片压…

蓝桥杯-求阶乘

问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…

Redis 分区:构建高性能、高可用的大规模数据存储解决方案

在 Redis 中&#xff0c;分区是一种将数据分布在多个实例上的技术&#xff0c;用于处理大规模数据和提高系统性能。通过分区&#xff0c;可以将数据均匀地分布在多个节点上&#xff0c;从而减轻单个节点的负载压力&#xff0c;并实现水平扩展。 Redis 分区应用场景 1. 大规模…

Go语言中如何处理goroutine和循环变量

对goroutine和循环变量处理不当可能是Go开发人员在编写并发应用程序时最常犯的错误之一。让我们看一个具体的例子,然后我们将定义发生此类错误的条件以及如何防止发生这类错误。 在下面的示例中,我们初始化一个切片,然后在作为新goroutine执行的闭包中访问这个元素: s := …

【Git教程】(九)版本标签 —— 创建、查看标签,标签的散列值,将标签添加到日志输出中,判断标签是否包含特定的提交 ~

Git教程 版本标签&#xff08;tag&#xff09; 1️⃣ 创建标签2️⃣ 查看存在的标签3️⃣ 标签的散列值4️⃣ 将标签添加到日志输出中5️⃣ 判断tag是否包含特定的提交&#x1f33e; 总结 大多数项目都是用 1.7.3.2和 “ gingerbread” 这样的数字或名称来标识软件版本的。在 …

5g和2.4g频段有什么区别

运行的频段不同 2.4G和5G频段的主要区别在于它们运行的频段不同&#xff0c;2.4G频段运行在2.4GHz的频段上&#xff0c;而5G频段&#xff08;这里指的是5GHz频段&#xff09;运行在5GHz的频段上。12 这导致了两者在传输速度、覆盖范围、抗干扰能力等方面的明显差异。以下是详…

数字图像处理与交叉学科中名词的拧巴

特征提取 图像处理——对图像、目标或特征点进行定量描述的方法及过程。 模式识别——对原特征进行特征变换&#xff0c;从高维空间到低维空间映射。 特征向量 模式识别、图像处理——一个观测包括多个变量&#xff0c;样本的多个特征组成特征向量。 线性代数——特征值对应的…

[闲聊统计]之参数估计是什么?(下)

我们在前面说了一下参数估计中的点估计&#xff0c;接下来&#xff0c;我们来讲一下区间估计。 区间估计——在点估计的基础上&#xff0c;给出总体参数估计的一个估计区间&#xff0c;该区间由样本统计量加减估计误差而得到。 置信水平——如果将构造置信区间的步骤重复多次&a…

01背包问题 小明的背包

2.小明的背包1 - 蓝桥云课 (lanqiao.cn) #include <bits/stdc.h> using namespace std; const int N1010;//开始写的105 开小了 样例过了但最后只过了很少一部分 int n,m; int v[N],w[N]; int f[N][N];int main() {cin>>n>>m;for(int i1;i<n;i){cin>&…

java语法:后端接收json对象

一、接收json格式对象 RequestBody String jsonObject 二、如何将json转成实体类 fastjson依赖 <!-- 9.fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version&…

javaWeb新闻发布及管理系统

摘 要 随着电脑、智能手机等能够连接网络设备的家庭化和大众化&#xff0c;各种网站开始被设计和开发出来&#xff0c;功能多种多样&#xff0c;涉及的领域也各有不同&#xff0c;生活、商业、科技等等。而信息的发布是网络的一大特点&#xff0c;人们上网的主要需求就是汲取自…

中高级前端需要掌握哪些Vue底层原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…