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

news2024/11/16 21:25:21

三层架构与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 {
    @Resource
    private UserService userService;
    @RequestMapping("/user/query")
    @ResponseBody
    public String queryUser(Integer id){
        return "查询用户的id是"+ id + "用户:" + userService.queryUser(id).toString();
    }
}

2.Service层中的基本注解

        @Service       

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

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

3.Dao层中的基本注解

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

对应的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//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.coloradmin.cn/o/1812570.html

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

相关文章

任务倒计时App

设计背景 在某一阶段可能需要给自己设置长期任务&#xff0c;比如找工作、考研等&#xff0c;需要一个单纯的任务计时工具&#xff0c;设置完任务的目标时间后&#xff0c;每次打开App时都能直接看到最新的剩余时间 设计步骤 1. 写java源码 由于需要界面显示&#xff0c;需…

pycharm下载和配置Anaconda环境

文章目录 一、 pycharm安装二、 安装 一、 pycharm安装 官网下载&#xff1a; https://www.jetbrains.com/pycharm/download/#sectionwindows Pycharm community Edition是免费的 二、 安装 安装目录有需要的可以自己更改。 三、创建项目 打开pycharm->继续->不发送。…

【UE数字孪生学习笔记】 虚幻日志系统

声明&#xff1a;部分内容来自于b站&#xff0c;知乎&#xff0c;慕课&#xff0c;公开课等的课件&#xff0c;仅供学习使用。如有问题&#xff0c;请联系删除。 部分内容来自UE官方文档&#xff0c;博客等 虚幻日志系统 1. 日志是一种非常实用的调试工具&#xff0c;可以详细…

AI赋能银行国际结算审单:合合信息抽取技术的实践与应用

官.网地址&#xff1a;合合TextIn - 合合信息旗下OCR云服务产品 时下&#xff0c;银行国际业务是金融体系的重要组成部分&#xff0c;涵盖了外汇交易、国际结算、贸易融资、跨境投资等领域&#xff0c;这些业务对于国际贸易和全球经济发展具有重要作用。国际业务部门单据、凭证…

renren-fast-vue在mac上的运行

被这个折磨好久了&#xff0c;终于成功了。。 版本号-node-14 需要提前执行的命令&#xff0c;希望可以帮助到大家。分别是解决版本在mac m1架构上的不兼容问题&#xff0c;另外解决没有验证码的问题&#xff0c;要注意数据库的配置&#xff0c;账号密码是否正确。 npm inst…

C语言中指针的说明

什么是指针&#xff1f; 在C语言当中&#xff0c;我们可以将指针理解为内存当中存储的地址&#xff0c;就像生活当中&#xff0c;一个小区里面&#xff0c;在小区里面有很单元&#xff0c;每一栋单元&#xff0c;单元内的房间有着不同的房间号&#xff0c;我们可以同过几栋几单…

JAVA开发 PDF文件生成表格,表格根据内容自动调整高度

1、展示效果 2、相关功能实现 JAVA开发 使用Apache PDFBox库生成PDF文件&#xff0c;绘制表格 3、实现代码 import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.ap…

Nginx+Tomcat负载均衡、动静分离原理

目录 一.Nginx负载均衡 1.负载均衡概念 2.负载均衡原理 3.Nginx反向代理 3.1.反向代理概念 3.2.Nginx实现负载均衡的主要配置项 二.Nginx动静分离 1.什么是动静分离 2.动态页面与静态页面区别 3.动静分离原理 三.NginxTomcat负载均衡的实验设计 1.部署nginx负载均衡…

周二A股走势分化,半导体板块逆势上涨,有色、航运等周期股下跌,贵州茅台跌3%

内容提要 午后创业板翻红&#xff0c;科创50大涨2.4%&#xff0c;半导体板块逆势上扬&#xff0c;中芯国际涨超3% 。 贵金属、航运板块跌幅居前&#xff0c;中远海控跌停。港股黄金、航运及地产板块也走弱&#xff0c;招金矿业跌超10%&#xff0c;中远海控大跌12%。 周二股市行…

品牌具象化:从经济到市场的深度解析

在当今日益激烈的市场竞争中&#xff0c;无论是传统行业还是电商行业&#xff0c;都面临着前所未有的挑战与机遇。越来越多的企业家开始意识到&#xff0c;单纯的产品竞争已经难以支撑企业的长远发展&#xff0c;而品牌的力量正逐渐凸显其重要性之一。本文将深入探讨品牌具象化…

HCIE认证,这些误区要避开

追求HCIE认证是许多网络工程师提升职业水平的选择之一。 然而&#xff0c;在这条备考之路上&#xff0c;存在不少误解可能会误导你的学习方向或影响你的备考效率。 了解并避开这些常见误区&#xff0c;将帮助你更有效地准备HCIE认证考试。 01 误区一&#xff1a;过分依赖题库 …

数据通信中的同步方式

同步指的是什么呢&#xff1f; 百度百科&#xff1a; 同步指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。 本意是指某人或某事同时进行&#xff1b;同时产生&#xff0c;比如音画同步、动作同步等。 同步&#xff08;英语&#xff1a;Synchronization&am…

第二十七章HTML.CSS综合案例(三)

5.小米侧边栏 效果如下&#xff1a; 代码图如下&#xff1a; <style>*{margin: 0;padding: 0;}ul{list-style: none;}a{text-decoration: none;}.box{width: 100%;height: 100%;position: absolute;background-image: linear-gradient(to right, #a07ad0, #c39340);}.…

喜讯 | 爱洁丽攸信技术uMOM制造运营系统项目启动会圆满成功!

2024年6月4日&#xff0c;厦门攸信信息技术有限公司&#xff08;以下简称“攸信技术”&#xff09;与福建爱洁丽日化有限公司&#xff08;以下简称“爱洁丽”&#xff09;uMOM制造运营系统项目启动会圆满成功 01合作客户介绍 Introduction of cooperative customers 福建爱洁…

问题:一般在管理工作复杂、面广且管理分工比较细致的单位,常采用()组织形式。 #媒体#媒体

问题&#xff1a;一般在管理工作复杂、面广且管理分工比较细致的单位&#xff0c;常采用()组织形式。 A&#xff0e;直线式 B&#xff0e;职能式 C&#xff0e;矩阵式 D&#xff0e;团队式 参考答案如图所示

使用MySQL

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 1 下载安装MySQL MySQL是一款开源的数据库软件&#xff0c;由于其免费特性得到了全世界用户的喜爱&#xff0c;是目前使用人数最多的数据库。下面将…

v-for循环出来的图片如何替换图片路径

滑过改变图片的路径 <div v-for"(item,index) in serverlist2" :key"index" class"serverlistitem serverlistitem2" mouseover"item.hover true"mouseleave"item.hover false"><div><img:src"item.…

论文阅读U-KAN Makes Strong Backbone for MedicalImage Segmentation and Generation

作为一种非常有潜力的代替MLP的模型&#xff0c;KAN最终获得了学术界极大的关注。在我昨天的博客里&#xff0c;解读了最近的热门模型KAN&#xff1a; 论文阅读KAN: Kolmogorov–Arnold Networks-CSDN博客 KAN的原文作者提到了很多不足。本文算是对其中两个现有不足的回应&am…

基于蚁群算法的二维路径规划算法(matlab)

微♥关注“电击小子程高兴的MATLAB小屋”获得资料 一、理论基础 1、路径规划算法 路径规划算法是指在有障碍物的工作环境中寻找一条从起点到终点、无碰撞地绕过所有障碍物的运动路径。路径规划算法较多&#xff0c;大体上可分为全局路径规划算法和局部路径规划算法两大类。其…