SpringBoot三层架构
目录
一、传统方式
二、三层架构
三、代码拆分
1、dao层
2、service层
3、control层
四、运行结果
一、传统方式

上述代码存在一定的弊端,在进行软件设计和软件开发中提倡单一责任原则,使代码的可读性更强,复杂性更低,可扩展性更好,更好的进行维护。所以也就有了三层架构的概念。
二、三层架构
controler:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
service:业务逻辑层,处理具体的业务逻辑。
dao:数据访问层(data access Object(持久层)),是负责数据访问操作,包括增、删、改、查。

三、代码拆分
1、dao层
首先在dao包下创建一个接口,这个接口名为EmpDao。(接口不能被实例化,只能被类实现。实现接口必须实现接口中的所有方法,除非该类本身是抽象类。方法不能包含方法体,接口中的方法隐式的被声明为共有抽象方法,即默认具有public abstract修饰符)
public interface EmpDao {
// 获取员工数据public List<Emp> listEmp();
}
然后在dao包下创建imp包,再创建接口的实现类EmpDaoA。
public class EmpDapA implements EmpDao {@Overridepublic List<Emp> listEmp() {//1. 加载并解析emp.xmlString file = "src/main/resources/emp.xml";System.out.println(file);List<Emp> empList = XmlParserUtils.parse(file, Emp.class);return empList;}
}
为什么要创建接口,然后过实现类实现,而不是直接创建类去实现?为了提高代码的可维护性、扩展性和复用性,解耦,我进行数据访问的方式时不一样,为了代码更加的灵活,所以使用的接口。
2、service层
EmpService.java
public interface EmpService {
// 获取员工列表public List<Emp> listEmp();
}
EmpServiceA.java
public class EmpServiceA implements EmpService {private EmpDao empDao=new EmpDapA();@Overridepublic List<Emp> listEmp() {//1. 调用dao,获取数据List<Emp> empList = empDao.listEmp();//2. 对数据进行转换处理 - gender, jobempList.stream().forEach(emp -> {//处理 gender 1: 男, 2: 女String gender = emp.getGender();if("1".equals(gender)){emp.setGender("男");}else if("2".equals(gender)){emp.setGender("女");}//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导String job = emp.getJob();if("1".equals(job)){emp.setJob("讲师");}else if("2".equals(job)){emp.setJob("班主任");}else if("3".equals(job)){emp.setJob("就业指导");}});return empList;}
}
service层是处理具体的业务逻辑。它处理的数据是从dao层获取的,所有在EmpServiceA类中需要定义一个EmpDao对象用来获取处理数据。在EmpServiceA类中的方法中通过EmpDao实例对象方法获取数据。
3、control层
EmpController.java
@RestController
public class EmpController {private EmpService empService=new EmpServiceA();@RequestMapping("/listEmp")public Result list(){
// 调用service,获取数据List<Emp> empList = empService.listEmp();//3. 响应数据return Result.success(empList);}
}
@RestController`是Spring框架中的一个注解,用于标记一个类作为RESTful Web服务的控制器。它结合了@Controller和@ResponseBody两个注解的功能,使得该类中的方法可以直接返回JSON或XML等格式的数据,而无需手动添加@ResponseBody注解。
四、运行结果
如果程序没有出错会有如下结果

相关文章:
SpringBoot三层架构
目录 一、传统方式 二、三层架构 三、代码拆分 1、dao层 2、service层 3、control层 四、运行结果 一、传统方式 上述代码存在一定的弊端,在进行软件设计和软件开发中提倡单一责任原则,使代码的可读性更强,复杂性更低,可扩展性…...
uniapp微信小程序局部刷新,无感刷新,修改哪条数据刷新哪条
uniapp做微信小程序时,一个商品列表滑到几百条数据时,点进去详情跳转去编辑信息上下架等,修改完成回来商品列表就到第一条数据了,这样页面效果体验感不是很好,是因为我们把数据接口放在onshow中了,每次回来…...
golan的雪花id
今天记录一下 golang的雪花id golang的雪花id 还是比较简单的,其包含的含义以及组成我这就不讲了,好多大佬都有文章写过,我直接上怎么用 先 引入包 go get "github.com/bwmarrin/snowflake" 代码块 func main() {// 设置一个时…...
RK3568 CAN波特率500K接收数据导致CPU4满载
最近调试RK3568 CAN时发现,当CAN作为接收端,在快速接收数据时会导致cpu4满载。down掉can口或者断开外设时恢复正常。并且问题只是在部门CPU版本上出现。在CAN接收中断中打印log,能发现log是按照接收数据的时间打印的。 驱动(rockchip_canfd…...
AI实战 | 使用元器打造浪漫仪式小管家
浪漫仪式小管家 以前我们曾经打造过学习助手和待办助手,但这一次,我们决定创造一个与众不同的智能体,而浪漫将成为我们的主题。我们选择浪漫作为主题,是因为我们感到在之前的打造过程中缺乏了一些仪式感,无法给对方带来真正的惊喜。因此,这一次我们计划慢慢调试,将它发…...
什么是隐马尔可夫模型?
文章目录 一、说明二、玩具HMM:5′拼接位点识别三、那么,隐藏了什么?四、查找最佳状态路径五、超越最佳得分对齐六、制作更逼真的模型七、收获 关键词:hidden markov model 一、说明 被称为隐马尔可夫模型的统计模型是计算生物学…...
qt中使用qsqlite连接数据库,却没有在本地文件夹中生成db文件
exe运行起来之后,发现没有在exe文件夹下生成数据库文件,,之前可以,但中间莫名其妙不行了,代码如下 // 建立和SQlite数据库的连接database QSqlDatabase::addDatabase("QSQLITE");// 设置数据库文件的名字da…...
Django的‘通用视图TemplateView’
使用通用视图的好处是:如果有一个html需要展示,不需要写view视图函数,直接写好url即可。 使用通用视图的步骤如下: 1、编辑项目urls.py文件 from django.views.generic import TemplateView 在该文件的映射表中添加:…...
java功能实现在某个时间范围之内输出true,不在某个范围输出false,时间精确到分钟
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DateTimeChecker { private static final Logger log LoggerFactory.getLogger(DateTimeChecker.class); /** * 检查当前时间是否在指定的小时和分钟范围内。 * * param startHour 开…...
macbook屏幕录制技巧,这2个方法请你收好
在当今数字化时代,屏幕录制成为了一项不可或缺的技能,无论是教学演示、游戏直播,还是软件操作教程,屏幕录制都能帮助我们更直观地传达信息。MacBook作为苹果公司的标志性产品,其屏幕录制功能也备受用户关注。本文将详细…...
vue-loader
Vue Loader 是一个 webpack 的 loader,它允许你以一种名为单文件组件 (SFCs)的格式撰写 Vue 组件 起步 安装 npm install vue --save npm install webpack webpack-cli style-loader css-loader html-webpack-plugin vue-loader vue-template-compiler webpack…...
IO系列(十) -TCP 滑动窗口原理介绍(上)
一、摘要 之前在上分享网络编程知识文章的时候,有网友写下一条留言:“可以写写一篇关于 TCP 滑动窗口原理的文章吗?”。 当时没有立即回复,经过查询多方资料,发现这个 TCP 真的非常非常的复杂,就像一个清…...
IPython 使用技巧整理
IPython 是一个增强的 Python 交互式 shell,提供了许多实用的功能和特性,使得 Python 编程和数据科学工作变得更加便捷和高效。以下是一些 IPython 的使用技巧整理: 1. 自动补全和查询 Tab 补全:在 IPython 中,你可以…...
Python 引入中文py文件
目录 背景 思路 importlib介绍 使用方法 1.导入内置库 importlib.util 2.创建模块规格对象 spec importlib.util.spec_from_file_location("example_module", "example.py") 3.创建模块对象 module importlib.util.module_from_spec(spec) …...
qt 实现模拟实际物体带速度的移动(水平、垂直、斜角度)——————附带完整代码
文章目录 0 效果1 原理1.1 图片旋转1.2 物体按照现实中的实际距离带真实速度移动 2 完整实现2.1 将车辆按钮封装为一个类:2.2 调用方法 3 完整代码参考 0 效果 实现后的效果如下 可以显示属性(继承自QToolButton): 鼠标悬浮显示文字 按钮…...
驱动开发(三):内核层控制硬件层
驱动开发系列文章: 驱动开发(一):驱动代码的基本框架 驱动开发(二):创建字符设备驱动 驱动开发(三):内核层控制硬件层 ←本文 目录…...
企业邮箱大附件无法上传?无法确认接收状态?这样解决就行
Outlook邮箱作为最常用的邮箱系统,被全世界企业采用作为内部通用沟通方式,但Outlook邮箱却有着明显的使用缺陷,如邮箱大附件上传障碍及附件接收无提示等。 1、企业邮箱大附件无法上传 Outlook企业邮箱大附件的上传上限一般是50M,…...
Kotlin 数据类(Data Class)
Kotlin 数据类(Data Class)是一种特别用于持有数据的类。它们简化了数据类的创建,并提供了一些自动生成的方法。下面详细介绍 Kotlin 数据类的原理和使用方法。 数据类的定义 Kotlin 中的数据类使用 data 关键字定义。例如: da…...
gridview自带编辑功能如何判断用户修改的值的合法性
在使用GridView的编辑功能更新值时,确保输入的值合法性是十分重要的。为了实现这一点,你可以在GridView的RowUpdating事件中加入代码来检查用户输入的值。如果发现输入的值不合法,你可以取消更新操作并向用户显示错误消息。下面是如何实现的步…...
设计模式-结构型-06-桥接模式
1、传统方式解决手机操作问题 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等),如图: UML 类图 问题分析 扩展性问题(类爆炸):如果我们再…...
紧急通知:2024年Q3起欧盟EDPS已将差分隐私实现纳入DPIA强制审查项——Python开发者必须立即核查的4个代码检查点
第一章:差分隐私合规性背景与EDPS新规解读随着欧盟数据保护监管体系持续演进,欧洲数据保护监督机构(EDPS)于2024年7月发布《关于匿名化与假名化技术在公共部门应用的指导意见》,首次将差分隐私(Differentia…...
vLLM-v0.17.1实操手册:vLLM服务升级策略与滚动更新最佳实践
vLLM-v0.17.1实操手册:vLLM服务升级策略与滚动更新最佳实践 1. vLLM框架概述 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,最新发布的v0.17.1版本带来了多项性能优化和功能增强。这个开源项目最初由加州大学伯克利分校的研究团队开发&am…...
从零开始:用正则表达式处理日期时间格式的完整指南
从零开始:用正则表达式处理日期时间格式的完整指南 在数据处理和文本分析中,日期时间格式的校验一直是个高频需求。无论是表单验证、日志分析还是数据清洗,确保日期时间格式的正确性都至关重要。正则表达式作为文本处理的瑞士军刀,…...
零基础玩转CTFShow Web1-7:手把手教你用Burp Suite和蚁剑拿flag
零基础玩转CTFShow Web1-7:从工具配置到实战渗透全指南 第一次接触CTF比赛时,看着其他选手在终端里敲出神秘代码就能拿到flag,总觉得这是黑客才能掌握的"黑魔法"。直到自己动手尝试才发现,只要掌握正确的工具和方法&…...
基于Vue的沧交食堂食品监管系统[vue]-计算机毕业设计源码+LW文档
摘要:本文阐述了一个基于Vue框架开发的沧交食堂食品监管系统。该系统旨在借助现代Web技术,强化对沧交食堂食品安全的监管力度,提升监管效率与质量。系统涵盖了系统用户管理、新闻数据管理、食品相关业务管理以及评论管理等多方面功能。文章详…...
Fish Speech 1.5入门指南:无需Python基础,5步完成高质量语音生成
Fish Speech 1.5入门指南:无需Python基础,5步完成高质量语音生成 你是不是也遇到过这些烦恼?想给视频配音,但自己的声音不好听,找配音员又太贵;想制作有声书,但录制过程繁琐,效果还…...
大数据产品实战:用户画像系统的设计与实现
大数据产品实战:用户画像系统的设计与实现 关键词:用户画像、标签体系、大数据平台、精准营销、数据挖掘 摘要:用户画像系统是大数据时代企业实现“以用户为中心”运营的核心工具,它通过给用户“贴标签”的方式,将复杂的用户行为转化为可量化、可分析的数字特征。本文将从…...
黑丝空姐-造相Z-Turbo实战项目:数据库课程设计之AI图库管理系统
黑丝空姐-造相Z-Turbo实战项目:数据库课程设计之AI图库管理系统 最近在带学生做数据库课程设计,发现一个挺有意思的现象:很多同学觉得数据库设计就是建几张表,写几个查询,做完就完了,跟实际应用脱节挺大的…...
OpenClaw技能扩展指南:为GLM-4.7-Flash添加自定义功能
OpenClaw技能扩展指南:为GLM-4.7-Flash添加自定义功能 1. 为什么需要自定义技能 去年冬天,当我第一次尝试用OpenClaw自动整理电脑上的照片时,发现现有的技能库无法满足我的特殊需求——按照拍摄地点和人物自动分类。这让我意识到࿰…...
uStepper S开源库深度解析:闭环步进控制与TMC2130驱动实战
1. uStepper S 开源驱动库深度解析:面向嵌入式工程师的实战指南 uStepper S 是一款集成了高性能步进电机驱动、高精度磁编码器反馈、ARM Cortex-M0 微控制器(NXP LPC11U35)与丰富外设接口的智能运动控制模块。其配套的 uStepper S Arduino…...
