举例详细学习和分析后端业务逻辑代码开发思路
在此之前,先来补充一下上一篇文章的一点内容:上一篇文章点击此处详看
对于画线的这句话,来详细解释一下吧!
这里面说,对于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);这是对套餐菜品关系表进行数据的删除!
大概的代码开发逻辑就是这样,意会意会!这也是对上一篇文章所说的业务逻辑代码开放思路的一个具体解释和举例!希望对你有帮助!
👍
相关文章:
举例详细学习和分析后端业务逻辑代码开发思路
在此之前,先来补充一下上一篇文章的一点内容:上一篇文章点击此处详看 对于画线的这句话,来详细解释一下吧! 这里面说,对于service服务层,如果我们所需要实现的业务比较简单的话可以直接在...service接口里面…...
面试经典算法150题系列-数组/字符串操作之轮转数组
序言:今天是算法系列的第六题啦,无需多说,上题! 轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3…...
苹果手机怎么录屏?一键操作,轻松掌握录屏技巧
最近新换了一台苹果手机,但苹果手机和安卓手机有挺多不相同的地方,就比如苹果手机怎么录屏我一直都没找到,有没有经常使用苹果手机的朋友可以帮帮我?先谢谢大家啦!” 苹果手机作为全球领先的智能手机品牌,…...
[Vue3] - 3 数据响应式
前言 在前端开发过程中,最为注重的就是数据的即时性和响应。但随着技术的发展vue2.0的数据响应方式,不能响应属性的新增和删除、以及通过数组下标修改界面不会自动更新等弊端逐渐显露。vue3.0为开发者提供了更为便捷的数据响应方式,接下来就让我们一起去探索一下。 目标 1 …...
【话题】“八股文”在实际工作中是助力、阻力还是空谈?
目录 前言 方向一:“八股文”对招聘过程的影响 方向二:“八股文”在日常工作中的实用价值 方向三:改进“八股文”学习和评估的方法 前言 在当今快速发展的信息技术领域,程序员的角色日益重要。随着技术的不断进步,…...
Windows 10 安装 WSL、安装 Go 以及配置环境变量的详细教程
安装 WSL 和 Ubuntu 启用 WSL 功能 以管理员身份打开 PowerShell。 运行以下命令以启用 WSL 功能: dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart启用虚拟机平台 继续在管理员 PowerShell 中运行以下命令以启…...
论文阅读:基于生物神经元的模拟游戏世界感知与学习
论文内容概述 AI要90分钟学会的游戏,人脑细胞竟在5分钟搞定了。Cell在2022年的研究中,使用80万体外神经元细胞(DishBrain)竟然学会玩70年代经典街机游戏Pong! 论文链接:In vitro neurons learn and exhibit sentience when emb…...
理解最先进模型的起点GPT-2 源码 配置的解释
理解最先进模型的起点GPT-2 源码 配置的解释 flyfish 为训练GPT模型设置和管理配置参数、日志记录以及实验的可重复性 理解最先进模型的起点GPT-2 理论知识 理解最先进模型的起点GPT-2 源码 注释 模型部分(from mingpt.model) utils.py import os import sys import json im…...
C++11 可变参数模板
C11的新特性可变参数模板能够创建可以接受可变参数的函数模板和类模板,相比C98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧&#x…...
项目实战——外挂开发(30小时精通C++和外挂实战)
项目实战——外挂开发(30小时精通C和外挂实战) 外挂开发1-监控游戏外挂开发2-秒杀僵尸外挂开发3-阳光地址分析外挂开发4-模拟阳光外挂开发5-无限阳光 外挂开发1-监控游戏 外挂的本质 有两种方式 1,修改内存中的数据 2,更改内存中…...
【人工智能专栏】Constructive损失解析
Constructive Loss 相比较于 MSE Loss \text{MSE Loss} MSE Loss 和 MAE Loss \text{MAE Loss} MAE Loss 直接将结果与目标数值比较的做法,使用 Constru...
PHP经销商订货管理系统小程序源码
经销商订货管理系统:重塑供应链效率的利器 🚀 开篇:解锁供应链管理的新纪元 在竞争激烈的商业环境中,经销商作为供应链的关键一环,其订货效率直接影响到整个供应链的流畅度和响应速度。传统的订货方式往往繁琐、易出…...
【网络世界】HTTPS协议
目录 🌈前言🌈 📁 HTTP缺陷 📁 HTTPS 📂 概念 📂 加密 📂 加密方式 📁 中间人攻击 📁 CA机构和证书 📂 数据摘要(数据指纹) &…...
根据空域图信息构造飞机航线图以及飞行轨迹模拟matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 航路网络建模 4.2 航线图构建 4.3 飞行轨迹模拟的具体步骤 5.完整程序 1.程序功能描述 空域图是指航空领域中的一种图形表示方式,它涵盖了空中交通管理所需要的各种信息&a…...
llama-factory 系列教程 (五),SFT 微调后的模型,结合langchain进行推理
背景 微调了一个 glm4-9B的大模型。微调后得到Lora权重,部署成vllm 的API,然后通过langchain接入完成相关任务的推理。 关于SFT 微调模型的部分就不做介绍了,大家可以参考前面的文章,将自己的数据集 在 Llamafactory 的 dataset…...
hive 中编写生成连续月sql
记录一下 sql 编写生成从一个确定的起始月份到当前月份的连续月份序列 SELECT substr(add_months(table1.start_dt,table2.pos),1,4) AS INDICT_YEAR,substr(add_months(table1.start_dt,table2.pos),1,7) AS INDICT_MON FROM (SELECT 2024-01-01 AS start_dt,substr(CURRE…...
前端开发实用的网站合集
文章目录 一、技能提升篇vueuseJavaScript中文网JavaScript.infoRxJsWeb安全学习书栈网码农之家 二、UI篇iconfont:阿里巴巴矢量图标库IconPark3dicons美叶UndrawError 404摹克 三、CSS篇You-need-to-know-cssCSS TricksAnimate.cssCSS ScanCSS Filter 四、颜色篇中…...
蓄势赋能 数智化转型掌舵人百望云杨正道荣膺“先锋人物”
2024年,在数据与智能的双涡轮驱动下,我们迎来了一个以智能科技为核心的新质生产力大爆发时代。在数智化浪潮的推动下,全球企业正站在转型升级的十字路口。在这个充满变革的时代,企业转型升级的道路充满挑战,但也孕育着…...
(七)前端javascript中的函数式编程技巧2
函数式编程范式的技巧 迭代算法-可以替代for in let count 10;while (count--) {console.log(count); }斐波拉契的实现 function fabci(n) {console.log("🚀 ~ fabci ~ n:", n);if (n 1 || n 2) {return 1;}return fabci(n - 1) fabci(n - 2);}cons…...
LeetCode热题 翻转二叉树、二叉树最大深度、二叉树中序遍历
目录 一、翻转二叉树 1.1 题目链接 1.2 题目描述 1.3 解题思路 二、二叉树最大深度 2.1 题目链接 2.2 题目描述 2.3 解题思路 三、二叉树中序遍历 3.1 题目链接 3.2 题目描述 3.3 解题思路 一、翻转二叉树 1.1 题目链接 翻转二叉树 1.2 题目描述 1.3 解题思路 根…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
