20240725java的Controller、DAO、DO、Mapper、Service层、反射、AOP注解等内容的学习

   在Java开发中,‌controller、‌dao、‌do、‌mapper等概念通常与MVC(‌Model-View-Controller)‌架构和分层设计相关。‌这些概念各自承担着不同的职责,‌共同协作以构建和运行一个应用程序。‌以下是这些概念的解释:‌

1.Controller:‌

(1)Controller是MVC架构中的控制层,
(2)负责处理用户请求,‌调用相应的服务层方法处理业务逻辑,‌并将结果返回给视图层展示。‌
(3)Controller类通常不直接操作数据,‌而是通过调用Service层的方法来处理业务逻辑,‌并负责协调前后端之间的交互。‌

总结:MVC的控制层、处理用户请求、调用服务层方法处理业务逻辑,将结果返回给视图。不直接操作数据。通过调用Service层处理业务逻辑、协调前后端交互。

负责接收用户的请求,‌并调用Service层来处理这些请求。‌
通常使用注解如@RequestMapping、‌@Controller等来标识和配置路由。‌
Controller层不直接处理业务逻辑,‌而是将请求转发给Service层处理,‌并将结果返回给用户。‌

2.DAO (Data Access Object):‌

(1)DAO层是数据访问层,‌主要负责与数据库进行交互,‌执行数据的增删改查操作。‌
(2)DAO类封装了对数据库的操作,‌使得业务逻辑层无需直接操作数据库,‌而是通过调用DAO类的方法来进行数据访问。‌
(3)这有助于将数据访问逻辑与业务逻辑分离,‌提高代码的可维护性和可扩展性。‌

总结:封装对数据库的操作、让数据访问逻辑和业务逻辑分离。

3.Do (Domain Object):‌

(1)Do类通常是领域对象,‌代表业务领域中的实体,‌如用户、‌订单等。‌
(2)它们通常与数据库中的表相对应,‌但可能包含更多的业务逻辑和属性。‌
(3)Do类在业务层中使用,‌用于处理具体的业务操作和数据交换。‌

总结:就是定义对象,通常与数据库表的对象对应,属于业务层。

这里是引用在某些上下文中,‌Do类可能指的是Data Object,‌它是用于封装数据的简单Java对象。‌
在ORM框架中,‌Do类通常与数据库表结构相对应,‌用于数据的传输。‌
有时也称为POJO(‌Plain Old Java Object)‌,‌即简单的Java对象。‌

4.Mapper:‌

(1)Mapper通常指的是MyBatis等ORM框架中的映射器,‌用于将数据库表与Java对象进行映射。‌
(2)Mapper类定义了如何从数据库表中读取数据以及如何将数据写入表中的规则。‌
(3)通过Mapper,‌可以将SQL语句与Java代码分离,‌使得数据库操作更加灵活和易于管理。‌
总结:映射器、将数据库表与Java对象进行映射,从数据库表中读取数据以及如何将数据写入表中,将SQL语句与Java代码分离

补充:ORM是"Object-Relational Mapping"的缩写,中文意思是对象关系映射。这是一种在编程中用于将对象模型表示的数据与关系数据库中的数据进行映射的技术。ORM框架允许开发者使用面向对象的方式来操作数据库——创建、查询、更新和删除数据,而不需要编写复杂的SQL语句。

Dao/Mapper层:‌数据访问层,‌负责与数据库进行交互。‌
使用ORM框架(‌如Spring Data JPA、‌MyBatis等)‌进行数据操作。‌
定义SQL语句或使用注解方式来映射数据库表与Java对象之间的关系。‌
提供CRUD(‌创建、‌检索、‌更新、‌删除)‌操作的方法供Service层调用。‌

4.Service层:‌

(1)业务逻辑层,‌负责处理具体的业务逻辑。‌
(2)调用Dao/Mapper层的方法来操作数据库,‌实现数据的增删改查等操作。‌
(3)可能包含事务控制、‌权限控制等。‌
(4)Service层通常采用接口+实现类的方式进行开发,‌以提高代码的可重用性和可维护性。‌

综上所述,‌Controller层主要负责接收请求并转发给Service层处理,‌Service层则处理具体的业务逻辑并通过Dao/Mapper层与数据库交互,‌而Do类则用于数据的封装和传输。‌这种分层架构有助于提高代码的可维护性、‌可重用性和可扩展性。‌

5.参考的博客

java各层学习参考博客1

(1)Controller层

Controller层是Java Web应用程序里面的控制层,主要负责接收客户端发送的请求、调度Service层的各个方法,并将处理的结果返回给客户端。同时,Controller层也可以对请求参数进行校验,防止错误数据的处理和提交。

Controller层主要使用 Spring MVC 相关的注解来映射请求和处理请求结果。例如,@RequestMapping注解用于配置基于请求URL的映射,@Controller注解用于标识该类为控制器类,@ResponseBody注解用于将返回结果序列化成JSON等格式返回给客户端。

(2)Service层

Service层是Java Web应用程序里面的业务逻辑层,主要负责处理业务逻辑、实现数据校验、事务控制、权限控制等方面。Service层通过调用Dao/Mapper层的接口来操作数据库,以完成具体的业务目标。

为了能够实现业务逻辑的独立性和可重用性,Service层通常采用接口+实现类的方式进行开发。Service层主要使用@Autowired注解来注入Dao/Mapper层的实例,并使用@Transactional注解来定义事务。

(3)Dao/Mapper层

Dao/Mapper层是Java Web应用程序里面的数据访问层,主要负责与数据库进行交互,进行数据读取、写入、修改、删除等操作。Dao/Mapper层通常使用Spring Data JPA、MyBatis等开源框架进行ORM操作。

在Dao/Mapper层中通常有一个Java接口和一个对应的XML文件(或注解方式进行映射),用于定义SQL语句,以完成数据的增、删、改、查操作。Dao/Mapper层中的方法会由Service层来调用,通过调用SQL语句来完成与数据库的交互。
在这里插入图片描述

总之,Controller、Service、Dao/Mapper层是Java Web应用程序中常用的三层架构,分别负责接收请求、处理业务逻辑和与数据库交互。合理地划分和组织这三层的代码,可以简化程序的开发和维护,提高代码的可重用性和可维护性。

6.Java中@RestController注解使用

@RestController的作用 @RestController注解是Spring框架中用于创建RESTful风格的控制器的注解。与@Controller注解不同,@RestController注解不仅包含了@Controller的功能,还自动将返回值转换为JSON格式。这意味着我们不需要手动编写任何转换逻辑,只需返回一个Java对象,Spring Boot会自动将其转换为JSON格式并写入HTTP响应体中。
在这里插入图片描述
我们将@RestController注解应用于MyController类上。然后,我们定义了一个处理GET请求的方法hello(),该方法返回一个字符串"Hello, Spring Boot!"。由于使用了@RestController注解,Spring Boot会自动将返回值转换为JSON格式并写入HTTP响应体中。

  • @RestController的优势 使用@RestController注解有以下几个优势:
    1)简化代码:使用@RestController注解后,我们无需手动编写转换逻辑,只需返回Java对象即可。这大大简化了代码量和开发时间。
    2)提高可读性:由于返回值会自动转换为JSON格式,我们可以更清晰地了解方法的返回结果,提高了代码的可读性。
    3)跨平台兼容性:使用@RestController注解生成的JSON数据具有跨平台兼容性,可以被各种客户端(如浏览器、移动应用等)轻松解析和使用。

  • @RestController的限制 尽管@RestController注解非常方便,但也有一些限制需要注意:
    1)不支持模板引擎:由于@RestController注解自动将返回值转换为JSON格式,因此它不支持模板引擎的使用。如果需要使用模板引擎生成动态内容,我们需要使用其他的注解(如@Controller)。
    2)仅适用于RESTful风格:@RestController注解仅适用于构建RESTful风格的应用程序。如果需要构建其他类型的Web应用程序,我们需要使用其他的注解(如@Controller)。

7.Java反射获取所有Controller和RestController类的方法

在这里插入图片描述
在这里插入图片描述

8.java捕获AOP级别的异常并将其传递到Controller层

  • 如何在一个现代的Java应用中,捕获AOP(面向切面编程)级别的异常,并将这些异常传递到Controller层进行合适的处理,异常处理在构建可靠的应用程序中起着关键作用,而AOP则可以帮助我们更好地管理和组织代码。
    参考博客AOP

  • 在Java中,使用AOP(面向切面编程)可以捕获方法级别的异常,并将异常信息传递到Controller层进行处理。AOP允许开发者将横切关注点(如日志记录、事务管理、安全性等)与业务逻辑分离,从而提高代码的模块化和可维护性。
    (1) 创建一个切面类
    首先,我们创建一个切面类ExceptionAspect,用于定义异常处理逻辑。

package com.example.aspect;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterThrowing;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;@Aspect
@Component
@RestControllerAdvice
public class ExceptionAspect {// 定义异常处理的方法@AfterThrowing(pointcut = "execution(* com.example.controller.*.*(..))", throwing = "exception")public void handleException(Exception exception) {// 这里可以记录日志、发送通知等System.out.println("捕获到异常:" + exception.getMessage());// 将异常信息封装为自定义异常响应对象// 假设我们有一个自定义的异常响应类叫做ErrorResponseErrorResponse errorResponse = new ErrorResponse("500", exception.getMessage());// 这里可以根据需要将异常信息传递给Controller层// 例如,可以通过ThreadLocal或者直接抛出RuntimeException来传递// 这里我们选择抛出RuntimeExceptionthrow new RuntimeException(errorResponse);}
}

(2)创建自定义异常响应类
接下来,我们创建一个自定义的异常响应类ErrorResponse,用于封装异常信息。

package com.example.model;public class ErrorResponse {private String code;private String message;public ErrorResponse(String code, String message) {this.code = code;this.message = message;}// getter和setter方法public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

(3)修改Controller层
我们需要在Controller层添加异常处理的逻辑。

package com.example.controller;import com.example.model.ErrorResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProductController {// 其他业务方法...// 异常处理器@ExceptionHandler(RuntimeException.class)public ResponseEntity<ErrorResponse> handleRuntimeException(RuntimeException ex) {ErrorResponse errorResponse = (ErrorResponse) ex;return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);}
}

(4)测试

假设在Controller中的某个业务方法抛出了异常,AOP切面ExceptionAspect会捕获这个异常,并执行handleException方法。在这个方法中,我们将异常信息封装为ErrorResponse对象,并通过抛出RuntimeException的方式传递给Controller层。Controller层的handleRuntimeException方法会捕获这个异常,并将其转换为HTTP响应返回给客户端。

(5)总结
通过AOP和Controller层的异常处理,我们可以将异常处理逻辑与业务逻辑分离,提高代码的清晰度和可维护性。同时,这种方式也使得异常信息能够以统一的方式返回给客户端,提高了用户体验。

9.Java中controller层如何接收带参数的查询

参考博客controller接收带参数的查询
(1)在Java中,Controller层通常用于处理HTTP请求和响应。它接收来自前端的请求,并将请求参数传递给Service层进行处理,最后返回结果。这里我们以一个简单的购物网站为例,来说明如何在Controller层接收带参数的查询。

假设我们有一个购物网站,用户可以通过URL查询商品信息。我们希望用户能够通过商品的ID来查询特定的商品。

package com.example.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProductController {private ProductService productService;public ProductController(ProductService productService) {this.productService = productService;}@GetMapping("/products/{id}")public Product getProductById(@PathVariable("id") int id) {return productService.getProductById(id);}
}

(2)解释代码
@RestController:这是一个注解,表示这个类是一个控制器,主要用于处理HTTP请求。
@GetMapping(“/products/{id}”):这是一个方法级别的注解,表示这个方法会响应GET请求,并且URL路径中包含一个变量{id}。这个变量会被传递给方法的参数。
@PathVariable(“id”):这个注解用于将URL中的变量提取出来,并将其作为参数传递给方法。
(3) 服务层(Service)
接下来,我们需要一个服务层来处理实际的业务逻辑。这里我们创建一个ProductService类

package com.example.service;import com.example.model.Product;public class ProductService {public Product getProductById(int id) {// 这里只是模拟,实际中可能需要查询数据库return new Product(id, "示例商品", 99.99);}
}

(4)模型层(Model)
我们还需要一个模型类来表示商品。

package com.example.model;public class Product {private int id;private String name;private double price;public Product(int id, String name, double price) {this.id = id;this.name = name;this.price = price;}// getter和setter方法public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}
}

(5) 测试
现在,假设用户通过浏览器访问http://localhost:8080/products/1,这个请求会被ProductController的getProductById方法处理。方法会从URL中提取出id参数(在这个例子中是1),然后调用ProductService的getProductById方法,最终返回一个商品对象。
(6)通过这种方式,Controller层可以接收带参数的查询,并将参数传递给服务层进行处理。这样不仅可以使代码更加清晰,还可以提高代码的可维护性和可扩展性。

10.java idea如何根据请求路径url自动找到对应controller方法插件

(未学习)
根据请求路径url自动找到对应controller方法插件

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

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

相关文章

Redis的两种持久化方式---RDB、AOF

rdb其实就是一种快照持久化的方式&#xff0c;它会将Redis在某个时间点的所有的数据状态以二进制的方式保存到硬盘上的文件当中&#xff0c;它相对于aof文件会小很多&#xff0c;因为知识某个时间点的数据&#xff0c;当然&#xff0c;这就会导致它的实时性不够高&#xff0c;如…

【游戏制作】使用Python创建一个美观的贪吃蛇游戏,附完整代码

目录 前言 项目运行结果 项目简介 环境配置 代码实现 主体结构 主要功能详解 界面和菜单 控制蛇的移动 食物生成和碰撞检测 游戏结束 运行游戏 总结 前言 贪吃蛇游戏是一款经典的电脑游戏&#xff0c;许多人都曾经玩过。今天我们将使用Python和ttkbootstrap库来实…

Mysql注意事项(一)

Mysql注意事项&#xff08;一&#xff09; 最近回顾了一下MySQL&#xff0c;发现了一些MySQL需要注意的事项&#xff0c;同时也作为学习笔记&#xff0c;记录下来。–2020年05月13日 1、通配符* 检索所有的列。 不建议使用 通常&#xff0c;除非你确定需要表中的每个列&am…

51单片机-第四节-定时器

一、定时器&#xff1a; 1.介绍&#xff1a; 单片机内部实现的计时系统。 作用&#xff1a;代替长时间Daley&#xff0c;提高cpu效率。 数量&#xff1a;至少2个&#xff0c;T0&#xff0c;T1&#xff0c;T2等。其中T0&#xff0c;T1为所有51单片机共有&#xff0c;T2等为不…

爬虫提速!用Python实现多线程下载器!

✨ 内容&#xff1a; 在网络应用中&#xff0c;下载速度往往是用户体验的关键。多线程下载可以显著提升下载速度&#xff0c;通过将一个文件分成多个部分并行下载&#xff0c;可以更高效地利用带宽资源。今天&#xff0c;我们将通过一个实际案例&#xff0c;学习如何用Python实…

typecho仿某度响应式主题Xaink

新闻类型博客主题&#xff0c;简洁好看&#xff0c;适合资讯类、快讯类、新闻类博客建站&#xff0c;响应式设计&#xff0c;支持明亮和黑暗模式 直接下载 zip 源码->解压后移动到 Typecho 主题目录->改名为xaink->启用。 演示图&#xff1a; 下载链接&#xff1a; t…

【proteus经典项目实战】51单片机用计数器中断实现100以内的按键计数并播放音乐

一、简介 一个基于8051微控制器的计数器系统&#xff0c;该系统能够通过按键输入递增计数&#xff0c;并且能够在达到100时归零。该系统将使用计数器中断和外部中断来实现其功能。 51单片机因其简单易用和成本效益高&#xff0c;成为电子爱好者和学生的首选平台。通过编程单片…

最新风车IM即时聊天源码及完整视频教程2024年7月版

堡塔面板 试验性Centos/Ubuntu/Debian安装命令 独立运行环境&#xff08;py3.7&#xff09; 可能存在少量兼容性问题 不断优化中 curl -sSO http://io.bt.sy/install/install_panel.sh && bash install_panel.sh 1.宝塔环境如下: Nginx 1.20 Tomcat 8 MySQL 8.0 R…

构造+有序集合,CF 1023D - Array Restoration

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1023D - Array Restoration 二、解题报告 1、思路分析 先考虑合法性检查&#xff1a; 对于数字x&#xff0c;其最左位置和最右位置 之间如果存在数字比x小&#xff0c;则非法 由于q次操作&#xff0c;第q…

GPT-4o mini:AI技术的平民化革命

目录 引言一、GPT-4o mini简介二、性能表现三、技术特点四、价格与市场定位五、应用场景六、安全性与可靠性七、未来展望八、代码示例结语 引言 在人工智能的浪潮中&#xff0c;大模型技术一直是研究和应用的热点。然而&#xff0c;高昂的成本和复杂的部署常常让许多企业和开发…

基于DMASM镜像的DMDSC共享存储集群部署

DMv8镜像模式共享存储集群部署 环境说明 操作系统&#xff1a;centos7.6 服务器&#xff1a;2台虚拟机 达梦数据库版本&#xff1a;达梦V8 安装前准备工作 参考文档《DM8共享存储集群》-第11、12章节 参考文档《DM8_Linux服务脚本使用手册》 1、系统环境(all nodes) 1…

学生党蓝牙耳机什么牌子的比较好?四大高性价比蓝牙耳机推荐

作为学生党&#xff0c;如果在有限的预算内选到一款合适自己的蓝牙耳机&#xff0c;那我们的生活和学习会增加很多的乐趣和便利&#xff0c;那面对市面上百元到千元不等的蓝牙耳机&#xff0c;学生党蓝牙耳机什么牌子的比较好&#xff1f;身为一名蓝牙耳机重度依赖者&#xff0…

AES算法分析:加密解密

✨主题简介 &#x1f510; 随着信息安全的重要性日益凸显&#xff0c;数据加密成为保护隐私和敏感信息的关键手段。本期我们将带你用Python实现AES加密解密&#xff0c;掌握这一强大的数据保护技术&#xff01; &#x1f4da;内容介绍 &#x1f50d; AES&#xff08;Advanced…

结构型设计模式-组合模式

一、组合模式 对于这个图片肯定会非常熟悉&#xff0c;上图我们可以看做是一个文件系统&#xff0c;对于这样的结构我们称之为树形结构。在树形结构中可以通过调用某个方法来遍历整个树&#xff0c;当我们找到某个叶子节点后&#xff0c;就可以对叶子节点进行相关的操作。可以将…

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

Discourse 备份和恢复中有关附件的问题

下面的这个问题是在官方论坛上网友问的内容是&#xff1a; 我想问一下&#xff0c;备份和附件分别挂载了不同的S3 备份的时候会把附件的S3里面的内容也都一起备份了吗&#xff1f;如果不选择包含上传的图片和附件&#xff0c;那么恢复备份的时候&#xff0c;附件用的S3里面的内…

【区块链+绿色低碳】雄韬智慧锂电储能管理系统 | FISCO BCOS应用案例

雄韬智慧锂电储能管理系统&#xff08;Energy Management System&#xff0c;以下简称 EMS&#xff09;是雄韬集团响应国家实现新型电力 系统建设&#xff0c;助力“碳达峰、碳中和”目标而自主开发的创新智慧锂电储能系统。 系统采用了 FISCO BCOS 联盟链&#xff0c;融合了物…

Java 8 中 20 个高频面试题及答案

文章目录 前言20 道高频题问题 1&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出列表中所有的偶数&#xff1f;问题 2&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出所有以 1 开头的数字&#xff1f;问题 3&#xff1a;如何使用 Stream 函数在给…

【C++题解】1782. 字符图形2-星号倒直角

问题&#xff1a;1782. 字符图形2-星号倒直角 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3…

微信Android一面凉经(2024)

微信Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《微信Android一面凉经(2024)》。 面试职位: 微信-客户端开发工程师-基础功能(广州) And…