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://xiahunao.cn/news/3268158.html

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

相关文章

Nestjs使用Redis的最佳实践

前几天在项目中有用到Redis JWT实现服务端对token的主动删除(退出登录功能)。故此介绍下如何在Nestjs中使用Redis&#xff0c;并做下总结。 知识准备 了解Redis - 网上很多简介。了解Nestjs如何使用jwt生成token - 可移步看下我之前的文章 效果展示 一、mac安装与使用 示…

Typora笔记上传到CSDN

1.Typora 安装 Typora链接&#xff1a;百度网盘 提取码&#xff1a;b6d1 旧版本是不需要破解的 后来的版本比如1.5.9把放在typora的根目录下就可以了 2.上传到CSDN 步骤 csdn 写文章-使用MD编辑器-导入本地md文件即可 问题 图片没法显示 原因 图片的链接是本地的 当然没法…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局&#xff0c;减需要分割两个模块选中&#xff0c;再点击spliter分割 2、在分割后&#xff0c;再对父界面进行布局设置 3、对于两边需要不等比列放置的&#xff0c;需要套一层 group box在最外层进行分割

模板编程中二义性问题

前言 菱形继承是 一个常见的二义性问题&#xff0c;这个问题在模板元编程中也很容易隐晦的存在 错误示例代码 #include <iostream>template <int N> struct A {int getN() { return N; } };template <int N> struct B : A<N % 2>, B<N / 2> {…

创建文件到底发生了什么?

为什么要浅浅探究这个问题&#xff1f; 大家大部分时间的工作其实都是写业务层的”CURD“&#xff0c;而真正陪伴在我们身边的计算机底层原理则不再有那么多好奇心去探究了。这篇文章旨在抛砖引玉&#xff0c;也许大家在空闲的时间里&#xff0c;也能够去探求自己以前一直想知…

AcWing最长连续不重复子序列

哈希表就完事儿了&#xff0c;key是a[j],value是a[j]出现次数 i丢到前面&#xff0c;j丢到后面&#xff0c;然后j往后面遍历&#xff0c;每次记录a[j]出现次数 m a p [ a [ j ] ] map[a[j]] map[a[j]]&#xff0c;如果a[j]出现次数2次及其以上 m a p [ a [ j ] ] > 1 map[a[…

信号量的实例

例题&#xff1a; 进程 a 和进程 b 模拟访问打印机&#xff0c;进程 a 输出第一个字符‘ a’表示开始使用打印 机&#xff0c;输出第二个字符‘ a’表示结束使用&#xff0c; b 进程操作与 a 进程相同。&#xff08;由于打印机同一时刻 只能被一个进程使用&#xff0c;所以输出…

【数据结构--排序】

目录 一、排序概述1.1、排序的相关定义1.2、排序用到的结构与函数 二、常见排序算法2.1、冒泡算法&#xff08;交换顺序&#xff09;&#xff08;1&#xff09;算法&#xff08;2&#xff09;性能分析 2.2、简单选择排序&#xff08;1&#xff09;算法&#xff08;2&#xff09…

yolov5-7环境搭建训练自己的模型

1.下载代码 git clone https://github.com/ultralytics/yolov5 # clone可以切到5-7版本&#xff0c;也可以去github选标签下载 2.配置好conda环境&#xff0c;网上教程比较多&#xff0c;不做讲解&#xff0c;python3.8即可。 3.在环境里安装pyrtorch 按自己的需求选取&am…

C#初级——条件判断语句、循环语句和运算符

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

『 Linux 』信号的捕捉及部分子问题

文章目录 信号的捕捉sigaction函数未决信号集的置零时机信号处理过程的阻塞可重入函数volatile 关键字SIGCHLD 信号 信号的捕捉 该图为基于信号处理为用户自定义动作的图解; 信号的捕捉 当一个信号被递达时,如果该信号的处理动作是用户自定义的函数(如int sighandler(int))时就…

钉钉 钉钉打卡 钉钉定位 2024 免费试用 保用

打卡助手定位 如图&#xff0c;表示开启成功&#xff0c;软件已定位到钉钉打卡位置。 测试显示&#xff0c;高德地图位置已成功修改。 开启助手定位后&#xff0c;观察效果&#xff0c;打卡按钮由无法打卡变为可打卡状态&#xff0c;照片还显示打卡地点。 伙伴们担心作弊行为会…

Prometheus Pushgateway 协议上报观测云最佳实践

Pushgateway 介绍 Pushgateway 是 Prometheus 生态系统中的一个组件&#xff0c;主要用于解决 Prometheus 默认的 pull&#xff08;拉取&#xff09;模式在某些情况下无法获取数据的问题&#xff0c;如监控源位于防火墙之后&#xff0c;Prometheus 无法穿透防火墙&#xff0c;…

嵌入式C++、Raspberry Pi、LoRa和Wi-Fi技术、TensorFlow、ROS/ROS2:农业巡检数据导航机器人设计流程(代码示例)

随着科技的不断进步&#xff0c;农业领域也在逐渐向智能化发展。农业巡检机器人作为农业智能化的重要组成部分&#xff0c;能够自动化地监测农作物生长状况&#xff0c;提高农业管理的效率和精确度。本文将介绍一个基于Raspberry Pi和NVIDIA Jetson的农业巡检机器人&#xff0c…

3U/6U CPCI 系统核心模块,可应用于电力、轨道交通等领域

一、3U CPCI核心模块 提供CPCI系列产品&#xff0c;具有&#xff0c;高性能&#xff0c;应用扩展灵活&#xff0c;X86软件兼容&#xff0c;无风扇设计&#xff0c;宽工作温度范围&#xff0c;长嵌入式生命周期等特点&#xff0c;满足不同客户的需求。 产品特点 Intel Pentium …

微信Android一面凉经(2024)

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

力扣高频SQL 50 题(基础版)第四题

文章目录 力扣高频SQL 50 题&#xff08;基础版&#xff09;第四题584.寻找用户推荐人题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50 题&#xff08;基础版&#xff09;第四题 584.寻找用户推荐人 题目说明 表: Customer -------------------- | Colu…

【Code Complete2】Note-1 [启发式编程、管理复杂度、隐藏设计]

【Code Complete2】_Note-1 [启发式编程、管理复杂度、隐藏设计] 文章目录 【Code Complete2】_Note-1 [启发式编程、管理复杂度、隐藏设计]启发式编程管理复杂度隐藏设计--减少“改动所影响的代码量” 启发式编程 ​ **设计是一个启发的过程&#xff0c;充满了不确定性&#…

Golang | Leetcode Golang题解之第283题移动零

题目&#xff1a; 题解&#xff1a; func moveZeroes(nums []int) {left, right, n : 0, 0, len(nums)for right < n {if nums[right] ! 0 {nums[left], nums[right] nums[right], nums[left]left}right} }

Anaconda +Pytorch安装教程

Anaconda Pytorch安装教程 Anaconda安装 小土堆的安装教程&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili Free Download | Anaconda 这里自己选一个文件夹安装即可 第一个红框表示添加图标到开始菜…