当前位置: 首页 > news >正文

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注解。

四、运行结果

如果程序没有出错会有如下结果

相关文章:

  • 高分论文密码---大尺度空间模拟预测与数字制图
  • 使用开源的zip.cpp和unzip.cpp实现压缩包的创建与解压(附源码)
  • 【机器学习】第2章 线性回归及最大熵模型
  • Android Room数据库使用介绍
  • SpringBoot3 整合 Mybatis 完整版
  • 【MySQL】分库分表
  • USB - 常用开发工具
  • C++ -- 红黑树的基本操作
  • 从零开始精通Onvif之图片抓拍
  • Mybatis --- 动态SQL 和数据库连接池
  • docker Pulling fs layer 含义
  • DeepSpeed Monitoring Comm. Logging
  • 速盾:什么是高防CDN?有什么优势?
  • 网络安全复习笔记
  • 入门Rabbitmq
  • __proto__ 和 prototype的关系
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 10个确保微服务与容器安全的最佳实践
  • Consul Config 使用Git做版本控制的实现
  • docker-consul
  • ES6系列(二)变量的解构赋值
  • java 多线程基础, 我觉得还是有必要看看的
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript DOM 10 - 滚动
  • Java应用性能调优
  • magento 货币换算
  • node入门
  • REST架构的思考
  • Vue UI框架库开发介绍
  • vue 配置sass、scss全局变量
  • 简单实现一个textarea自适应高度
  • 实习面试笔记
  • Linux权限管理(week1_day5)--技术流ken
  • ​ssh免密码登录设置及问题总结
  • # linux从入门到精通(三)
  • #if和#ifdef区别
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (C语言)字符分类函数
  • (libusb) usb口自动刷新
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (pycharm)安装python库函数Matplotlib步骤
  • (超详细)语音信号处理之特征提取
  • (三)uboot源码分析
  • (四)JPA - JQPL 实现增删改查
  • (杂交版)植物大战僵尸
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 后台导出excel ,word
  • .NET 中让 Task 支持带超时的异步等待
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .sh
  • @Conditional注解详解