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

news2024/11/18 0:15:33
   在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());
        
        // 将异常信息封装为自定义异常响应对象
        // 假设我们有一个自定义的异常响应类叫做ErrorResponse
        ErrorResponse errorResponse = new ErrorResponse("500", exception.getMessage());
        
        // 这里可以根据需要将异常信息传递给Controller层
        // 例如,可以通过ThreadLocal或者直接抛出RuntimeException来传递
        // 这里我们选择抛出RuntimeException
        throw 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.coloradmin.cn/o/1949337.html

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

相关文章

深度学习趋同性的量化探索:以多模态学习与联合嵌入为例

深度学习趋同性的量化探索&#xff1a;以多模态学习与联合嵌入为例 参考文献 据说是2024年最好的人工智能论文&#xff0c;是否有划时代的意义&#xff1f; [2405.07987] The Platonic Representation Hypothesis (arxiv.org) ​arxiv.org/abs/2405.07987 趋同性的量化表达 …

OAK相机支持的图像传感器有哪些?

相机支持的传感器 在 RVC2 上&#xff0c;固件必须具有传感器配置才能支持给定的相机传感器。目前&#xff0c;我们支持下面列出的相机传感器的开箱即用&#xff08;固件中&#xff09;传感器配置。 名称 分辨率 传感器类型 尺寸 最大 帧率 IMX378 40563040 彩色 1/2.…

产品经理-简历的筛选标准(22)

什么是简历 简要地描述过往的经历—一份简历的核心要素就是介绍你所经历过的事情 因此准备简历的关键是“简”“要”二字&#xff1a; 一方面是你挑选出来的事情&#xff0c;一定是重要的、能给予你所谋求的位置提供竞争力的事情&#xff1b;另一方面是在描述这件事情的时候 要…

《Java初阶数据结构》----6.<优先级队列之PriorityQueue底层:堆>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

Golang | Leetcode Golang题解之第290题单词规律

题目&#xff1a; 题解&#xff1a; func wordPattern(pattern string, s string) bool {word2ch : map[string]byte{}ch2word : map[byte]string{}words : strings.Split(s, " ")if len(pattern) ! len(words) {return false}for i, word : range words {ch : patt…

【Python实战因果推断】56_因果推理概论6

目录 Causal Quantities: An Example Bias Causal Quantities: An Example 让我们看看在我们的商业问题中&#xff0c;你如何定义这些量。首先&#xff0c;你要注意到&#xff0c;你永远无法知道价格削减&#xff08;即促销活动&#xff09;对某个特定商家的确切影响&#xf…

算法 定长按组翻转链表

一、题目 已知一个链表的头部head&#xff0c;每k个结点为一组&#xff0c;按组翻转。要求返回翻转后的头部 k是一个正整数&#xff0c;它的值小于等于链表长度。如果节点总数不是k的整数倍&#xff0c;则剩余的结点保留原来的顺序。示例如下&#xff1a; &#xff08;要求不…

数据集成工具之kettle

Kettle 是一个用于数据集成的开源工具&#xff0c;由 Pentaho 开发&#xff0c;现已由 Hitachi Vantara 维护。Kettle 的全名是 Pentaho Data Integration (PDI)&#xff0c;主要用于数据提取、转换和加载&#xff08;ETL&#xff09;过程。 1. 核心组件 Spoon: 图形化的设计工…

【MetaGPT系列】【MetaGPT完全实践宝典——多智能体实践】

目录 前言一、智能体1-1、Agent概述1-2、Agent与ChatGPT的区别 二、多智能体框架MetaGPT2-1、安装&配置2-2、使用已有的Agent&#xff08;ProductManager&#xff09;2-3、多智能体系统介绍2-4、多智能体案例分析2-4-1、构建智能体团队2-4-2、动作/行为 定义2-4-3、角色/智…

mysql面试(六)

前言 本章节详细讲解了一下mysql执行计划相关的属性释义&#xff0c;以及不同sql所出现的不同效果 执行计划 一条查询语句经过mysql查询优化器的各种基于成本和各种规则优化之后&#xff0c;会生成一个所谓的 执行计划&#xff0c;这个执行计划展示了这条查询语句具体查询方…

Qt自定义MessageToast

效果&#xff1a; 文字长度自适应&#xff0c;自动居中到parent&#xff0c;会透明渐变消失。 CustomToast::MessageToast(QS("最多添加50张图片"),this);1. CustomToast.h #pragma once#include <QFrame>class CustomToast : public QFrame {Q_OBJECT pub…

广义线性模型(2)线性回归

线性回归算法应该是大多数人机器学习之路上的第一站&#xff0c;因为线性回归算法原理简单清晰&#xff0c;但却囊括了拟合、优化等等经典的机器学习思想。 说到线性回归&#xff0c;我们得先说说回归与分类、线性与非线性这些概念的区别。 一 分类与回归的区别 机器学习中的…

【虚拟机】Windows(x86)上部署ARM虚拟机(Ubuntu)

【虚拟机】Windows&#xff08;x86&#xff09;上部署ARM虚拟机&#xff08;Ubuntu&#xff09; 零、起因 最近在学嵌入式&#xff0c;这就不得不涉及ARM指令集&#xff0c;但是电脑是x86指令集的&#xff0c;用手机不太方便&#xff0c;买开发板又要等几天……&#xff0c;总…

商场导航系统:从电子地图到AR导航,提升顾客体验与运营效率的智能解决方案

商场是集娱乐、休闲、社交于一体的综合性消费空间&#xff0c;随着商场规模的不断扩大和布局的日益复杂&#xff0c;顾客在享受丰富选择的同时&#xff0c;也面临着寻路难、店铺曝光率低以及商场管理效率低下等挑战。商场导航系统作为提升购物体验的关键因素&#xff0c;其重要…

springcloud RocketMQ 客户端是怎么走到消费业务逻辑的 - debug step by step

springcloud RocketMQ &#xff0c;一个mq消息发送后&#xff0c;客户端是怎么一步步拿到消息去消费的&#xff1f;我们要从代码层面探究这个问题。 找的流程图&#xff0c;有待考究。 以下我们开始debug&#xff1a; 拉取数据的线程&#xff1a; PullMessageService.java 本…

【无标KaiwuDB CTO 魏可伟:差异化创新,面向行业的多模架构题】

2024年7月16日&#xff0c;KaiwuDB CTO 魏可伟受邀于 2024 可信数据库发展大会主论坛发表演讲《多模一库 —— KaiwuDB 的现代数据库架构探索》&#xff0c;以下是演讲精华实录。 多模数据库 是顺应时代发展与融合趋势的产物 数据模型最早始于网状模型和层次模型&#xff0c;…

删除的视频怎样才能恢复?详尽指南

在日常生活中&#xff0c;我们有时会不小心删除一些重要的视频文件&#xff0c;或者在整理存储空间时不慎丢失了珍贵的记忆片段。这时候&#xff0c;我们可以通过一些数据恢复工具和技巧&#xff0c;找回这些被删除的视频。本文将详细介绍几种常见且有效的视频恢复方法&#xf…

升腾c92安装ubuntu20.04 server(二)

一、本人使用大白菜制作的U盘安装ubuntu服务出现了如下错误 通过晚上查询知道&#xff0c;出现unable to find a medium containing a live file system 是因为U盘和升腾c92的u口不匹配导致&#xff0c;解决方案如下&#xff1a; 一、安装软碟通 在安装完软碟通之后&#xf…

git 版本回退-idea

1、选中项目&#xff0c;右键&#xff0c;打开 git历史提交记录 2、选中想要回退的版本&#xff0c;选择 hard&#xff08;不保留版本记录&#xff09; 3、最终选择强制提交&#xff08;必须强制&#xff09; OK&#xff0c;搞定

合作伙伴中心Partner Center中添加了Copilot预览版

目录 一、引言 二、Copilot 功能概述 2.1 Copilot 简介 2.2 Copilot 的核心功能 2.3 Copilot 的访问和使用 三、Copilot 的使用方法 3.1 Copilot 功能区域 3.2 Copilot 使用示例 3.2.1 编写有效提示 3.2.2 使用反馈循环 四、负责任的人工智能 4.1 Copilot 结果的可…