MVC 架构学习笔记

MVC 架构学习笔记

  • Service 与 DAO 层方法命名规约
  • 业务错误是用返回值来处理还是抛异常来处理

Service 与 DAO 层方法命名规约

CRUD 是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中 DataBase 或者持久层的基本操作功能。对应这里的 crud 方法的命名,每个人有不同的实践。以下是阿里编程规范推荐写法:

  • 获取单个对象的方法用 get 做前缀,如 getById
  • 获取多个对象的方法用 list 做前缀,如 listByCondition
  • 获取统计值的方法用 count 做前缀,如 countByCondition
  • 插入的方法用 save(推荐)或 insert 做前缀
  • 删除的方法用 remove(推荐)或 delete 做前缀
  • 修改的方法用 update 做前缀

Dao 层应当只负责接收最终的 sql 语句,具体到某一张表的增删查改,因为列表的效率从经验上来说大大低于多次查询单表的效率

Service 层也不是就非有不可,对于极小的项目而言,加了 Service 层,反而增加了代码量,而且 Dao 层中已经预见了可能出现的情况,并进行了相应的扩展。那么,此时就不需要了

业务错误是用返回值来处理还是抛异常来处理

业务层给接口层传递错误信息无外乎几种方式

  • 封装统一返回类,一般构成是 code+msg,复杂点可以再封装一层 data 用于存储数据,然后上层先判断 code==true 才去获取 data 内容
  • 封装业务异常类,在各个判断或边界检查不符合的时候直接抛出自定义的异常类,上层通过捕获异常来获取非成功流程提示信息

1和2效率无疑是较高的,但1方式功能有限,无法提供比较详细的非成功流程信息

2比1提高了很多的扩展性,基本会满足大多数场景,但代码可读性较差,上层需要通过层层判断来获取信息。代码显得不够优雅,我们知道 java 异常效率低下是因为抛出异常会遍历所有涉及堆栈,具体代码在基类 Throwable 的 fillInStackTrace() 方法里。但其实可以通过在自定义异常中重写 fillInStackTrace() 来大幅度提高异常效率。这样业务异常抛出是不会有堆栈信息,上层只能获取到定义的异常 message

具体该使用1还是使用2完全可以看团队要求,保持统一风格即可,调优本来就是一个取舍的过程,没有十全十美的方案,许多细节只能争取做到平衡,然后去关注其他要点,比如一个烂 sql 带来的损耗可能比 1-2 方案之间的损耗要大数百倍

同时,处理业务异常的时候需要考虑监控报警问题,线上就因为没考虑监控会收集 error 日志以及访问接口时返回为500的次数,没有将业务异常与系统异常分离开,导致监控噪音很大,因此,抛出业务异常的时候应当考遵守以下写法:

  • 业务异常特殊处理。在 catch Exception 之前,先 catch ServiceException,业务异常打 info 日志,系统异常打监控也好,打 error 日志也好,无所谓了
  • 如果不想这么写,那么业务异常直接封装统一返回类返回
  • 记得不要将业务异常直接丢给前端,接口会报500,导致前端同学觉得我们的水平很次,接口经常不能用。我们可以写个全局异常处理,因此处理校验异常 MethodArgumentNotValidException、业务异常 ServiceException 等,如果抛出了除了这些以外的异常,我们打个 error 日志,然后给前端返回错误码与问题描述
  • 业务码 code 和 httpCode 区分开,我们的 httpCode 应当尽可能保证是200,当然也可以是301、302、用户无权限401、402等,但是尽量不要是500。业务码 code 则可以自己将一些常见的业务问题总结一下给前端了,比如用户没有写入权限、调用 RPC 接口异常、处理逻辑代码超时等等

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

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

相关文章

Java编程规约 :OOP 规约

文章目录 引言I OOP规约【强制】【推荐】II 知识扩展:库的分类:(一方、二方、三方库)选择定义III 术语npe异常引言 I OOP规约 【强制】 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。禁止在 POJO 类中,同时存在对应属性 xxx 的 isXxx() 和…

RBAC权限控制

1、Spring Security 是一个功能强大的Java安全框架,它提供了全面的安全认证和授权的支持。 2 SpringSecurity配置类(源码逐行解析) Spring Security的配置类是实现安全控制的核心部分 开启Spring Security各种功能,以确保Web应…

ArcGIS Pro地形图四至角图经纬度标注与格网标注

今天来看看ArcGIS Pro 如何在地形图上设置四至角点的经纬度。方里网标注。如下图的地形图左下角经纬度标注。 如下图方里网的标注 如下为本期要介绍的例图,如下: 图片可点击放大 接下来我们来介绍一下 推荐学习:GIS入门模型构建器Arcpy批量…

Kubernetes Gateway API-2-跨命名空间路由

1 跨命名空间路由 Gateway API 具有跨命名空间路由的核心支持。当多个用户或团队共享底层网络基础设施时,这很有用,但必须对控制和配置进行分段,以尽量减少访问和容错域。 Gateway 和 Route(HTTPRoute,TCPRoute,GRPCRoute) 可以部署到不同的命名空间中,路由可以跨命名空间…

Web API和Web Services的区分

前些年一提及自动化测试,大多是指UI界面层的自动化测试。近几年,随着分层自动化测试概念的兴起,以及自动化测试自身的发展与细分,自动化测试包含了更多的内容。 API(Application ProgrammingInterface,应用程序编程接…

使用c#制作坐标

1、建立坐标 2、坐标系的放大缩小 3、标定刻度 4、实时显示鼠标在坐标系上的坐标 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using S…

JVM实战—JVM内存设置与对象分配流转

1.JVM内存划分的原理细节 (1)背景引入 接下来介绍JVM内存的分代模型:新生代、老年代、永久代。现在已知代码里创建的对象,都会进入到Java堆内存中。如下所示,main()方法会周期性执行loadReplicasFromDisk()方法来加载副本数据。 public class…

node.js和js

JavaScript 核心语法 (ECMAScript) 变量和作用域:var、let、const声明,作用域链。数据类型和结构:基本数据类型(Undefined、Null、Boolean、Number、BigInt、String、Symbol),复合数据类型(对象…

设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)

前言: 设计一个完整的 监控摄像头物联网 IoT 平台 涉及 视频直播和点播、WebRTC 和 文件存储模块,可以分为以下几个主要部分:摄像头设备、服务端处理、Web 前端、视频流存储和回放。以下是结合这些技术的一个具体完整流程设计,涵盖…

嵌入式单片机中Flash存储器控制与实现

第一:嵌入式单片机内部Flash概述 1.存储器的概念 存储器指的是若干个存储单元的集合,每个存储单元都可以存储若干个二进制数,为了方便的操作存储单元,就为每个存储单元都分配了地址,就可以通过寻址来访问存储单元。由于计算机的处理的数据量较大,并且运算速度都很快,就…

Debian 12 安装配置 fail2ban 保护 SSH 访问

背景介绍 双十一的时候薅羊毛租了台腾讯云的虚机, 是真便宜, 只是没想到才跑了一个月, 系统里面就收集到了巨多的 SSH 恶意登录失败记录. 只能说, 互联网真的是太不安全了. 之前有用过 fail2ban 在 CentOS 7 上面做过防护, 不过那已经是好久好久之前的故事了, 好多方法已经不…

ASP.NET Core Web API Hangfire

ASP.NET Core Web API Hangfire 前言一、安装二、相关代码1.代码片段2.代码片段3.运行效果 三、测试代码1.即发即弃作业2.延迟作业3.重复作业4.延续作业5.页面调度作业 前言 👨‍💻👨‍🌾📝记录学习成果,以…

实用技巧:关于 AD修改原理图库如何同步更新到有原理图 的解决方法

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144738332 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

【Ubuntu 20.4安装截图软件 flameshot 】

步骤一: 安装命令: sudo apt-get install flameshot 步骤二: 设置快捷方式: Ubuntu20.4 设置菜单,点击 号 步骤三: 输入软件名称, 软件快捷命令(flameshot gui)&am…

ue5 pcg(程序内容生成)真的简单方便,就5个节点

总结: 前情提示 鼠标单击右键平移节点 1.编辑-》插件-》procedural->勾选两个插件 2.右键-》pcg图表-》拖拽进入场景 3.先看点point 右键-》调试(快捷键d)->右侧设置粒子数 3.1调整粒子数 可以在右侧输入框,使用加减乘除 4.1 表面采样器 …

JavaWeb(一) | 基本概念(web服务器、Tomcat、HTTP、Maven)、Servlet 简介

1. 基本概念 1.1、前言 web开发: web,网页的意思,www.baidu.com静态 web html,css提供给所有人看的数据始终不会发生变化! 动态 web 淘宝,几乎是所有的网站;提供给所有人看的数据始终会发生变化&#xf…

CTFshow-SSRF文件上传

web351 <?php error_reporting(0); highlight_file(__FILE__); $url$_POST[url]; $chcurl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $resultcurl_exec($ch); curl_close($ch); echo ($result); ?> 构造POST …

Vue3项目的换肤思路

1. 整体架构 项目采用了 Vue3 Vuex 的技术栈来实现换肤功能&#xff0c;主要包含以下几个核心部分&#xff1a; 主题配置文件&#xff08;src/utils/theme.js&#xff09;主题切换组件&#xff08;src/components/ThemeSwitch.vue&#xff09;主题状态管理&#xff08;src/s…

信息安全管理:信息安全组织管理策略

信息安全组织管理目的是建立信息安全责任体系和定义组织内的信息安全责任&#xff0c;建立清晰的信息安全责任体系是实现信息安全目标的保证。 一、信息安全组织架构与职责定义 信息安全组织为跨部门协调组织&#xff0c;由信息安全领导组、信息安全管理组、信息安全执行组、…

线性代数行列式

目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得&#xff1a;分…