举例详细学习和分析后端业务逻辑代码开发思路

news2024/9/9 4:00:56

在此之前,先来补充一下上一篇文章的一点内容:上一篇文章点击此处详看

对于画线的这句话,来详细解释一下吧!

这里面说,对于service服务层,如果我们所需要实现的业务比较简单的话可以直接在...service接口里面将方法实现,而复杂的业务逻辑则需要另外加一个实现类...serviceImpl来实现对应的方法。

这里再补充一下:就是我们在后端代码编写的时候,Impl实现类并不是必须的,其实它只是起到一个使得我们写的业务逻辑代码更加清晰,不会使得方法看起来很复杂。

这里可以举一个简单的例子:

比如我们正在开发一个外卖管理平台,那么我们肯定需要将要出售的菜品展示给用户看,我们从平台管理者的角度看,最简单的业务就是对菜品的增删查改,而这个增删查改的逻辑其实都差不多,但它们都是属于对菜品的管理,四个功能需要四个方法来实现,那么我们在编写代码时,肯定先在controller控制层先响应请求,然后再到服务层来实现这几个方法,而在service服务层,我们如果要把四个方法都写在...service类里面的话,那就包括(实现方法的逻辑代码,sql的编写)对于sql的编写,若是简单的sql倒没什么,如果是比较复杂的动态sql,那么全部堆在这个service类里面,下次需要来修改什么功能的话会相当难找,还可能影响到其他的功能。而这时候我们就需要再加一个ImplService实现类,在service接口层里面单纯地定义方法,再将方法的具体实现代码编写到ImplService实现类里面,接着,将复杂的动态sql编写到xml文件里面。这样,如果我们需要修改哪个方法或sql语句,我们就随时可以定位到该位置快速修改,不会太冗杂。

当然,上面说了,并不是所有的业务逻辑都需要Impl实现类,就像上一篇文章里面的新增员工业务,单纯的实现这个功能只需要一句简单的sql语句,我们就不需要另开一个实现类去实现。

好了,进入正题,我们来分析学习下面的代码开放思路!

eg.这是一个关于删除的业务(删除套餐)

先对其进行需求分析:

业务规则:

  • 可以一次删除一个套餐,也可以批量删除套餐

  • 起售中的套餐不能删除

接口信息:

        Path: /admin/setmeal

        Method: DELETE

接口描述:

        请求参数:Query

                参数名称:ids       必须       

        返回数据:

                数据名称:code      非必须

                                  data       非必须

                                  msg       非必须

代码实现:controller—> service—> serviceImpl—> mapper—> (动态sql--mapper.xml)

SetmealController:
/**
     * 批量删除套餐
     * @param ids
     * @return
*/
@DeleteMapping
@ApiOperation("批量删除套餐")
public Result delete(@RequestParam List<Long> ids){
    setmealService.deleteBatch(ids);
    return Result.success();
}

首先,先编写Controller层,封装所需要的数据,其中ids,我们可以从上面的接口信息知道这是请求参数且是必须的,所以delete()括号中需要封装前端提交过来的请求参数,接着就需要一个根据ids删除的方法对吧(deleteBatch),我们可以先将其写出来,然后再到setmealService接口层去创建这个方法。最后返回响应结果。

SetmealService:
/**
     * 批量删除套餐
     * @param ids
*/
void deleteBatch(List<Long> ids);

SetmealService接口层,这里面单纯定义方法给Controller控制层调用实现删除功能。

而具体的实现逻辑是在实现类编写。

SetmealServiceImpl:
/**
     * 批量删除套餐
     * @param ids
*/
@Transactional
public void deleteBatch(List<Long> ids) {
    ids.forEach(id -> {
        Setmeal setmeal = setmealMapper.getById(id);
        if(StatusConstant.ENABLE == setmeal.getStatus()){
            //起售中的套餐不能删除
            throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
        }
    });

    ids.forEach(setmealId -> {
        //删除套餐表中的数据
        setmealMapper.deleteById(setmealId);
        //删除套餐菜品关系表中的数据
        setmealDishMapper.deleteBySetmealId(setmealId);
    });
}

SetmealServiceImpl就是所需的实现类,在里面编写删除方法的具体逻辑,其中,if条件语句是在判断要删除的套餐中是否有菜品正在起售,如果有则返回错误信息,没有则删除套餐中的数据和套餐菜品关系表中的数据。当然,这里没有展示套餐表和菜品表。理解其逻辑就行!接着,在这里面,要实现对套餐中菜品信息的遍历和删除,需要用到getById()和deteleById()以及deleteBySetmealId()3个方法。它们都将在mapper持久层中实现。

SetmealMapper:
/**
     * 根据id查询套餐
     * @param id
     * @return
*/
@Select("select * from setmeal where id = #{id}")
Setmeal getById(Long id);

/**
     * 根据id删除套餐
     * @param setmealId
*/
@Delete("delete from setmeal where id = #{id}")
void deleteById(Long setmealId);

这是对套餐表进行查询和删除!这里我们可以看到,在方法上面直接进行sql的实现,这是因为这个业务删除的复杂度并不高,所以不需要用到动态sql,如果需要的话,会另外编写在XML文件中。

SetmealDishMapper:
/**
     * 根据套餐id删除套餐和菜品的关联关系
     * @param setmealId
*/
@Delete("delete from setmeal_dish where setmeal_id = #{setmealId}")
void deleteBySetmealId(Long setmealId);

这是对套餐菜品关系表进行数据的删除!

 大概的代码开发逻辑就是这样,意会意会!这也是对上一篇文章所说的业务逻辑代码开放思路的一个具体解释和举例!希望对你有帮助!

👍

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

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

相关文章

Spring事件监听的核心机制及其原理

Spring事件监听 Spring的事件监听机制主要由三大核心部分组成即事件&#xff0c;监听器和播放器三部分组成。 事件的发布是通过spring当中的pulishEvent方法实现。事件监听实现是通过监听器监听了对应事件的监听器来实现的。 事件监听的作用&#xff1a;为系统业务之间进行一…

一种可以灵活、高速测试半导体测试中使用的老化板的系统

本文介绍了一种可以灵活、高速测试半导体测试中使用的老化板的系统。 定义&#xff1a;Burn-in Board Testing System是一种通过模拟极端使用条件&#xff08;如高温、高压、高湿等&#xff09;来加速半导体器件老化&#xff0c;并检测其潜在失效的测试系统。目的&#xff1a; …

如何使用 Puppeteer 绕过 Akamai

摘要&#xff1a; 本文深入探讨了在面对Akamai强大防护下的网页抓取挑战时&#xff0c;如何运用Puppeteer这一强大的Node.js库&#xff0c;通过模拟真实用户行为、动态请求处理等策略&#xff0c;高效且隐蔽地收集数据。我们将一步步揭开Puppeteer绕过Akamai的神秘面纱&#x…

红酒标签设计:艺术与品味的结合

在红酒的世界里&#xff0c;每一瓶酒都如同一位优雅的舞者&#xff0c;在酒柜的舞台上静静诉说着自己的故事。而红酒的标签&#xff0c;则是这位舞者身上较华丽的舞裙&#xff0c;它不仅是红酒的身份证明&#xff0c;更是艺术与品味的很好结合。今天&#xff0c;我们就来聊聊红…

计网 - 传统的类网络划分 vs 无类别域间路由CIDR

文章目录 A、B、C 类网络的基本概念和历史背景A 类网络B 类网络C 类网络实际应用场景 CIDR&#xff08;无类别域间路由&#xff09;基本概念CIDR 的表示方法计算 CIDR 网络段的步骤步骤 1&#xff1a;确定网络掩码步骤 2&#xff1a;计算网络地址步骤 3&#xff1a;计算广播地址…

二刷代码随想录训练营Day 11| 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、总结

1.逆波兰表达式 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 代码&#xff1a; class Solution { public:int evalRPN(vector<string>& tokens) {stack<long long> st;for(int i 0; i < tokens.size(); i){if(tokens[i] "" || tokens[i…

横看成岭侧成峰,山的叫法何其多。丘 陵 峰 岭 峦 岑 峭 嶂 岳 屺 岵 峡 岬 冈 崮 麓 顶 梁 包 坡 尖

文章目录 引言顶、梁、包、坡、尖山脚叫麓较低而平的山脊叫冈(岗)四周陡峭顶上较平的山叫崮(g)两山之间,有水为峡两山之间,无水为岬(jiǎ)没有草木的山叫屺(qǐ)多草木的山叫岵(h)高而险的山叫嶂高而大的山叫岳高而陡的山叫峭(qio)小而高的山叫岑小而尖的山叫峦高…

在亚马逊云科技AWS上开发大模型应用服务并设计提示词工程

项目简介&#xff1a; 接下来&#xff0c;小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何利用亚…

昇思25天学习打卡营第6天|基础知识-函数式自动微分

目录 环境 函数与计算图 微分函数与梯度计算 Stop Gradient Auxiliary data 神经网络梯度计算 学习打卡时间 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08…

【C++红黑树应用】模拟实现STL中的map与set

目录 &#x1f680; 前言一&#xff1a; &#x1f525; 红黑树的修改二&#xff1a; &#x1f525; 红黑树的迭代器 三&#xff1a; &#x1f525; perator() 与 operator--() 四&#xff1a; &#x1f525; 红黑树相关接口的改造✨ 4.1 Find 函数的改造✨ 4.2 Insert 函数的改…

推荐珍藏已久的 3 款优质电脑软件,每一款都值得拥有

Advanced Find and Replace Advanced Find and Replace是一款功能强大的文本查找和替换工具&#xff0c;能够高效地在多个文档中进行复杂的内容操作。它支持通配符和正则表达式&#xff0c;使得用户可以精确地定位和替换特定的文本内容。该软件不仅适用于普通文本文件&#xff…

防洪评价报告编制方法与水流数学模型建模技术

原文链接&#xff1a;防洪评价报告编制方法与水流数学模型建模技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247610610&idx2&sn432d30cb40ec36160d635603c7f22c96&chksmfa827115cdf5f803ddcaa03a21e3721d6949d6a336062bb38170e3f9d5bd4d391cc36cc…

【速记!】3DMAX的50个常用快捷键

分享一组基本的3dMax动画和建模快捷键&#xff0c;以用于你的建筑项目。 3dMax是创建三维模型和动画的设计师中流行的软件。它用于建筑、电子游戏或其他需要高清晰度和高精度图形的视觉项目&#xff0c;是视觉艺术家寻找新工具的理想伴侣&#xff0c;这些工具可以帮助他们详细…

Vue3实战案例 知识点全面 推荐收藏 超详细 及附知识点解读

最近经常用到vue中的一些常用知识点&#xff0c;打算系统性的对 vue3 知识点进行总结&#xff0c;方便自己查看&#xff0c;另外也供正在学习 vue3 的同学参考&#xff0c;本案例基本包含 Vue3所有的基本知识点&#xff0c;欢迎参考&#xff0c;有问题评论区留言&#xff0c;谢…

Linux基本功能

Linux 操作系统&#xff0c;作为开源社区的明星之一&#xff0c;以其稳定性、安全性和灵活性在全球范围内得到广泛应用。 1. 多用户和多任务支持 Linux 是一个真正的多用户系统&#xff0c;允许多个用户同时登录并在同一时间内运行多个程序。每个用户拥有自己的账户和权限&…

每日OJ_牛客HJ86 求最大连续bit数

目录 牛客HJ86 求最大连续bit数 解析代码 牛客HJ86 求最大连续bit数 求最大连续bit数_牛客题霸_牛客网 解析代码 根据位运算&#xff0c;获取每一位的二进制值。获取第i位的值&#xff1a; (n >> i) & 1或者 n & (1 << i)。如果1连续&#xff0c;则计数…

Redis 安装和数据类型

Redis 安装和数据类型 一、Redis 1、Redis概念 redis 缓存中间件&#xff1a;缓存数据库 nginx web服务 php 转发动态请求 tomcat web页面&#xff0c;也可以转发动态请求 springboot 自带tomcat 数据库不支持高并发&#xff0c;一旦访问量激增&#xff0c;数据库很快就…

网工内推 | 合资公司、上市公司数据库工程师,OCP/OCM认证优先,双休

01 欣旺达电子股份有限公司 &#x1f537;招聘岗位&#xff1a;数据库管理高级工程师 &#x1f537;岗位职责&#xff1a; 1、负责数据库规划、管理、调优工作&#xff1b; 2、负责数据库应急预案制定、应急预案维护和应急支持&#xff1b; 3、负责数据库异常处理&#xff…

Unity UGUI 之 事件触发器

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本&#xff0c;请注意分别 1.什么是UI事件触发器…

linux安装jdk和jps(为rocketMq准备)

20240730 一、安装rocketMq之前的准备工作1. 安装jkd&#xff08;这里以1.8为例子&#xff09;1.1 下载jdk1.81.2 上传到linux&#xff08;拖拽&#xff09;1.3 解压1.4 配置环境变量1.5 使配置文件生效1.6 验证结果 2. JPS2.1 解决 一、安装rocketMq之前的准备工作 1. 安装jk…