springboot三层架构与MVC,以及三层架构入门

三层架构与MVC

1. 三层架构是什么

把各个功能模块划分为表示层,业务逻辑层,和数据访问层三层架构,各层之间采用接口相互访问,并通过对象模型的实体类(model)作为数据传递的载体,不同的对象模型实体类一般对应数据库的不同表。

正所谓,上层对下层的调用是通过接口实现的;下层对上层的真正服务提供者,是下层接口的实现类。

接口是相同的,实现类是可以更换的。

2. 三层架构的目的

“高内聚,低耦合”

3.分层方式

  • 表示层(视图层View)

​ 在表示层调用业务层的方法,前台设计,相关控件,数据缓存都属于表示层。

​ 就是实现用户界面,将用户的需求传达和反馈。

  • 业务层(服务层Service)

​ 数据访问的逻辑放在业务层。对具体问题进行逻辑判断与执行操作;

​ 接收到表现层 的用户指令后,会连接数据访问层,作为表示层和数据层的桥梁,实现三层之间的数据连接和指令传达,对 接收数据 进行逻辑处理,实现数据的修改,获取,删除等功能,并将处理结果反馈到表示层,实现软件功能。

  • 数据层(持久层Dao)

包含所建的数据库和一些存储过程(实现数据访问,分页,搜索算法等),被业务层调用

​ 是数据库的主要操作系统,实现 数据库 的增删改查等操作,并将操作结果反馈到业务逻辑层

​ 在实际运行的过程中,数据访问层没有逻辑判断能力,为了实现代码编写的严谨性,提高代码阅读程度,一般软件开发人员会在该层中编写 Data AccessCommon,保证数据访问层 数据处理功能。

  • 实体类库

    ​ 实体类库是数据库表的映射对象,在开发过程中,要建立对象实例,将关系数据库表采用对象实体化的方式表现出来,利用 GET 与 SET 把数据库表中的所有字段映射为系统对象,建立实体类库,进而实现各个结构层的参数传输,服务于其他三层。

举例:

假设数据库里有一个表 BOOKS(书),建立一个存储过程 GetAllBooks,用来读取书的信息,这样在业务层里编一个方法 GetBookS()和一个公用数据库访问类,GetBooks()就通过数据库访问类打开连接,执行在存储过程,返回数据 (返回类型可以是 DataT - able,DataSet,DataReader 或 者 实 体 类)。业务层单独编译成一个或者几个 DLL 文件。表示层通过调用GetBookS()返回数据绑定在相关的控件里。

4. 数据库与应用服务器的连接

应用服务器利用SQL语言进行连接数据库服务器。

5.什么是MVC

  • View

视图,为用户提供界面,与用户直接进行交互,处理数据可视化的部分。

  • Model

模型,用于处理应用程序数据逻辑的部分,实现增删改查功能,通常负责在数据库中存取数据,代表一个存取数据的对象或JAVA POJO

  • Controller

控制器,处理用户交互的部分。通常负责从视图读取数据,控制用户输入,并向model发送数据,在数据变化时更新视图。

1)接受请求,并将该请求跳转(转发,重定向)到模型进行处理

2)模型处理完毕后,再通过控制器,返回给视图中的请求。

当单机web页面中超链接和发送表单时,控制器本身不输出任何东西和做任何处理,仅对请求进行解析。他只是接受请求并决定调用哪个模型构建去处理请求,在确定用哪个视图来显示返回的数据

6. MVC与三层架构的关系

7.一个简单的业务流程

  1. web视图发送一个请求 去往一个接口,比如/login
  2. 找到对应的 Controller,在spring 中具体路径体现为RequestMapping("/login")
  3. 访问这个路径,执行该``RequestMapping`中的逻辑
  4. Controller 找到对应的Service
  5. Service找到对应的Dao
  6. Dao联合Model(Bean)操作数据库
  7. 返回结果给Controller
  8. Controller对结果进行处理

这就是大概的流程结构,好那接下来就是springboot相关的了

SpringBoot框架前言


SpringB是一个基于Java的开源框架,用于创建微服务。它由Pivotal Team开发,用于构建独立的生产就绪Spring应用。 SpringBoot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件,简化开发。

一、SpringBoot中三层架构是什么?


Controller层:(顾名思义 控制层)控制并处理http请求,将其不同的业务类型转送给Service层处理,并将Service层处理好的数据返回前端。入门来说,一个Controller对应一个Service,而一个Seervice也对应一个Dao就好了,感受程序是如何层层递进的。

二、三层架构的基本注解的使用


1.Controller层中的基本注解
        1.1@Controller       
                 标注于类体上,声明该类是Controller(相当于告诉你我是控制器)
        1.2@RequestMapping
                标注于方法体上,用于指定访问路径
        1.3@ResponseBody       

                标注于方法体上,用于返回数据到<body>标签

@Controller
public class UserController {@Resourceprivate UserService userService;@RequestMapping("/user/query")@ResponseBodypublic String queryUser(Integer id){return "查询用户的id是"+ id + "用户:" + userService.queryUser(id).toString();}
}

2.Service层中的基本注解

        @Service       

                标注于Service接口的实现类上,将当前类自动注入到Spring容器中

@Service
public class UserServiceImp implements UserService {@Resourceprivate UserDao userDao;@Overridepublic User queryUser(Integer id) {User user = userDao.selectById(id);return user;}
}

3.Dao层中的基本注解

        @Mapper 标注于接口的上方,用于框架寻找接口和对应接口的xml文件

对应的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.start.springbootmapper.dao.UserDao">
<select id="selectById"resultType="com.start.springbootmapper.entities.User">select uid,username,password from t_user where uid=#{uid}
</select>
</mapper>

三、对应的pom文件与properties文件

        properties文件:

server.servlet.context-path=/orm
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=                                                     
spring.datasource.username=                                                
spring.datasource.password=                                                
#implements separating management for java files and xml files
mybatis.mapper-locations=classpath:mapper/*.xml
#output logs to console
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

四,pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.start</groupId><artifactId>springboot-mapper</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-mapper</name><description>springboot-mapper</description><properties><java.version>1.8</java.version></properties><dependencies><!-- Web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Mybatis依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.4</version></dependency><!-- Mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>8.0.27</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId></dependency></dependencies><build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes></resource></resources><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

总结

              这几个注解是SpringBoot中基础的注解通过这几个注解的使用可以写一个小的工程实现对数据库的访问并将数据显示到前端。

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

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

相关文章

深入理解计算机系统 家庭作业6.22

每条磁道存 位 有r-xr条磁道 二者相乘就是我们要求的容量) 所以最大值x0.5

计算机网络 —— 运输层(运输层概述)

计算机网络 —— 运输层&#xff08;运输层概述&#xff09; 运输层运输层端口号复用分用复用&#xff08;Multiplexing&#xff09;分用&#xff08;Demultiplexing&#xff09; 常用端口号页面响应流程 我们今天进入到运输层的学习&#xff1a; 运输层 我们之前学习的物理层…

最新大屏幕互动系统PHP源码 附动态背景图和配乐素材

本文来自&#xff1a;最新大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程 - 源码1688 应用介绍 简介&#xff1a; 最新大屏幕互动系统PHP源码 附动态背景图和配乐素材 含搭建教程 测试环境&#xff1a;NginxPHP7.0MySQL5.6 前端图片&#xff1a; 后台图片&#x…

【算法专题--链表】相交链表--高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双指针 --- 数学思维 ⭐双指针 --- 按链表长度计算 &#x1f95d; 判断相交 &#x1f347; 求出交点 &#x1f34d;实现步骤 四、总结与提炼 五、共勉 一、前言 相交链表这道题&#xff0c;可以说是--链表专题--&#xf…

OpenAI半年收入达34亿美元:年化收入翻倍,CTO却揭露:ChatGPT与免费模型差距不大

根据硅谷知名付费科技媒体The Information的独家报道&#xff0c;自12月以来&#xff0c;OpenAI的年化收入翻了一番&#xff0c;达到34亿美元&#xff0c;其中大部分收入来自订阅和API访问&#xff08;32亿美元&#xff09;。 没体验过OpenAI最新版GPT-4o&#xff1f;快戳最详细…

【日常记录】【node】从零开发一个node命令行工具

1、命令行工具 命令行工具&#xff08;Cmmand Line Interface&#xff09;简称cli&#xff0c;顾名思义就是在命令行终端中使用的工具。我们常用的 git 、npm、vim 等都是 cli 工具&#xff0c;比如我们可以通过 git clone 等命令简单把远程代码复制到本地。 再比如&#xff1a…

Apache druid未授权命令执行漏洞复现

简介 Apache Druid是一个实时分析型数据库&#xff0c;旨在对大型数据集进行快速的查询分析&#xff08;"OLAP"查询)。Druid最常被当做数据库来用以支持实时摄取、高性能查询和高稳定运行的应用场景&#xff0c;同时&#xff0c;Druid也通常被用来助力分析型应用的图…

5款好用的轻量云服务器(618超便宜轻量云)

轻量云服务器是一种面向入门级用户和小型业务的云服务器产品&#xff0c;它们通常价格更实惠&#xff0c;管理起来也相对简单&#xff0c;以下是五款好用的轻量云服务器产品&#xff1a; 1.阿里云 优势&#xff1a;阿里云是国内最大的云服务提供商之一&#xff0c;拥有丰富的配…

BT音频方案

一、缩写 缩写 全程 释义 I2S I2S 音频传输接口总线 PCM Pulse-Code Modulation 基础音频数据或翻译为音频接口总线 HFP Handsfree 蓝牙通话协议 A2DP Advanced Audio Distribution Profile 蓝牙媒体音频协议 二、音频流转策略 蓝牙音频功能分为通话声音和媒体…

电脑数字键被锁住不能输入数字

情况: 反复点击数字键盘的NumLock,看它的灯是否能正常启动 1.如果NumLock灯可以正常的打开和关闭,并且无法输入内容 1.1打开控制面板 1.2 进入轻松使用中选择更改键盘的工作方式 1.3找到并点击设置鼠标键 1.4 赵到NumLock设置为关闭,然后确定即可

线性规划问题——单纯形算法

第一步&#xff1a;化“约束标准型” 在每个等式约束中至少有一个变量的系数为正&#xff0c;且这个变量只在该约束中出现。在每个约束方程中选择一个这样的变量称为基本变量。 剩下变量称为非基本变量。 一个简单的栗子 上图是一个约束标准型线性规划的例子。 等式1&#x…

理解查准率P、查全率R及Fβ度量怎么得来的

如果得到的是一组样本在两个算法上的一次预测结果&#xff0c;其中每个样本都被赋予了一个为正样本的概率&#xff08;例如&#xff0c;通过逻辑回归或朴素贝叶斯分类器得到的概率估计&#xff09;&#xff0c;那么可以通过改变不同的阈值点来利用这些预测结果画出PR曲线。 如果…

blender

通用设置: 仅显示/取消隐藏:数字键盘/移动视角:shift+鼠标中键Blender如何给场景添加参考图片-百度经验 (baidu.com)进入编辑模式:Tab编辑模式:点-线-面 反选:ctrl+按键重新计算面朝向:shift+n水密:+修改器:焊接连选的区别: 视窗设置 两个视图 …

Pytorch环境配置的方法

Pytorch虚拟环境配置全流程 以安装pytorch1.9.1为例 1. 创建虚拟环境 安装Anaconda3&#xff0c;打开 PowerShell 创建虚拟环境并进入&#xff1a; conda create -n torch1.9.1 python3.8 conda activate torch1.9.1 conda create -n torch1.9.1 python3.8 conda activate to…

错题记录(小测)

单选 错题1 错题2 错题3 代码题 反转链表 链表的回文结构

【LeetCode】4,寻找两个正序数组中的中位数

题目地址 B站那个官方解答视频实在看不懂&#xff0c;我就根据他那个代码和自己的理解写一篇文章 1. 基本思路 在只有一个有序数组的时候&#xff0c;中位数把数组分割成两个部分。中位数的定义&#xff1a;中位数&#xff0c;又称中点数&#xff0c;中值。中位数是按顺序排列…

消息队列的应用场景有哪些

通常来说&#xff0c;使用消息队列主要能为我们的系统带来下面三点好处&#xff1a; 异步处理 削峰/限流 降低系统耦合性 除了这三点之外&#xff0c;消息队列还有其他的一些应用场景&#xff0c;例如实现分布式事务、顺序保证和数据流处理。 异步处理 通过异步处理提高系…

计算机网络:网络层 - IPv4数据报 ICMP协议

计算机网络&#xff1a;网络层 - IPv4数据报 & ICMP协议 IPv4数据报[版本 : 首部长度 : 区分服务 : 总长度][标识 : 标志 : 片偏移][生存时间 : 协议 : 首部检验和][可变部分 : 填充字段] ICMP协议 IPv4数据报 一个IPv4数据报&#xff0c;由首部和数据两部分组成&#xff…

Python 越来越火爆

Python 越来越火爆 Python 在诞生之初&#xff0c;因为其功能不好&#xff0c;运转功率低&#xff0c;不支持多核&#xff0c;根本没有并发性可言&#xff0c;在计算功能不那么好的年代&#xff0c;一直没有火爆起来&#xff0c;甚至很多人根本不知道有这门语言。 随着时代的…

递归解析 LXML 树并避免重复进入某个节点

1、问题背景 我们在使用 LXML 库解析 MathML 表达式时&#xff0c;可能会遇到这样一个问题&#xff1a;在递归解析过程中&#xff0c;我们可能会重复进入同一个节点&#xff0c;导致解析结果不正确。例如&#xff0c;我们希望将以下 MathML 表达式解析为 Python 表达式&#x…