理清SpringBoot CURD处理逻辑、顺序

news2024/12/29 13:35:09

在这里插入图片描述

💗wei_shuo的个人主页

💫wei_shuo的学习社区

🌐Hello World !


理清SpringBoot CURD处理逻辑、顺序

  1. Controller(控制器):
    • 控制器接收来自客户端的请求,并负责处理请求的路由和参数解析。
    • 控制器通常会调用相应的服务层方法来处理业务逻辑,并将结果返回给客户端。
  2. Service(服务层):
    • 服务层包含了应用程序的业务逻辑。
    • 服务层通常会调用数据访问对象(DAO)来进行数据的读取、写入和修改。
    • 服务层可以对数据进行处理、验证和转换,并协调多个数据访问对象的操作。
    • 服务层的方法可以被控制器调用,也可以被其他服务层方法调用。
  3. DAO(数据访问对象):
    • 数据访问对象负责与数据源(如数据库)进行交互,执行数据的读取、写入和修改操作。
    • DAO通常会定义一组方法,用于执行CRUD操作(创建、读取、更新、删除)。
    • DAO可以使用ORM(对象关系映射)工具或手动编写SQL语句来与数据源进行交互。
    • DAO的实现可以是直接操作数据库的类,也可以是使用ORM框架生成的类。
  4. PO(持久化对象):
    • 持久化对象是与数据源中的表或集合相对应的对象。
    • 持久化对象通常具有与数据表字段相对应的属性,并提供了用于读取和写入数据的方法。
    • 持久化对象可以由ORM框架自动生成,也可以手动编写。
  5. Repo(仓库接口):
    • 仓库接口定义了对领域对象的持久化和查询方法。
    • 仓库接口通常包含根据特定条件查询领域对象的方法,如根据ID查询、根据条件查询等。
    • 仓库接口提供了抽象的方法,用于与具体的数据访问对象进行交互。
  6. RepoImpl(仓库实现类):
    • 仓库实现类是仓库接口的具体实现。
    • 仓库实现类负责将仓库接口定义的方法与具体的数据访问对象(DAO)进行关联。
    • 仓库实现类实现了仓库接口中定义的方法,并根据需要调用相应的DAO方法。
  7. Mapper(映射器):
    • 映射器是一种用于将持久化对象与数据库表之间进行映射的工具。
    • 映射器可以根据配置文件或注解来定义对象与表之间的映射关系。
    • 映射器可以将持久化对象的属性映射到数据库表的列,并提供了CRUD操作的方法

联表查询接口

  • Controller
    @GetMapping("status")
    @ApiOperation("公告状态")
    @Logger(menu = "首页", action = "公告状态")
    public Result noticeStatus() {
        List<SystemNoticeResponse> responses = systemNoticeService.SystemNoticeStatus();
        return Result.succ(responses);
    }
  • Service
    /**
     * 公告状态
     *
     * @param
     * @return
     */
    public List<SystemNoticeResponse> SystemNoticeStatus() {
        Long merchantId = AuthContextHolder.getLoginMerchant().getId();
        List<SystemNoticeReaderResponse> systemNoticeReaderResponses = systemNoticeReaderRepo.SystemNoticeReaderStatus(merchantId);
        Map<String, Integer> idNoticeIdMap = new HashMap<>();
        for (SystemNoticeReaderResponse response : systemNoticeReaderResponses) {
            if (response.getId().equals(response.getNoticeId())) {
                idNoticeIdMap.put(response.getId(), 1);//已阅读:1
            } else {
                idNoticeIdMap.put(response.getId(), 0);//待阅读:0
            }
        }
        List<SystemNoticeResponse> noticeResponses = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : idNoticeIdMap.entrySet()) {
            String id = entry.getKey();
            long parseLong = Long.parseLong(id);
            SystemNoticeResponse response = new SystemNoticeResponse(
                    parseLong,
                    systemNoticeRepo.getById(parseLong).getNoticeTitle(),
                    systemNoticeRepo.getById(parseLong).getNoticeContent(),
                    systemNoticeRepo.getById(parseLong).getCreateAt(),
                    entry.getValue()
            );
            noticeResponses.add(response);
        }

        noticeResponses = noticeResponses.stream()
                .sorted(Comparator.comparing(SystemNoticeResponse::getReadStatus)
                        .thenComparing(Comparator.comparing(SystemNoticeResponse::getCreateAt).reversed()))
                .collect(Collectors.toList());

        return noticeResponses;
    }
  • Repo
List<SystemNoticeReaderResponse> SystemNoticeReaderStatus(Long merchantId);
  • RepoImpl
   @Override
    public List<SystemNoticeReaderResponse> SystemNoticeReaderStatus(Long merchantId) {
        return baseMapper.systemNoticeStatus(merchantId);
    }
  • Mapper
List<SystemNoticeReaderResponse> systemNoticeStatus(Long id);
  • Mapper.xml
    <select id="systemNoticeStatus" parameterType="java.lang.Long" resultMap="systemNoticeStatusResultMap">
        SELECT y.id, s.notice_id
        FROM "system_notice" as y
                 LEFT JOIN "system_notice_reader" as s ON y."id" = s.notice_id AND s.merchant_id = #{id}
    </select>

    <resultMap id="systemNoticeStatusResultMap" type="com.moozumi.bean.response.notice.SystemNoticeReaderResponse">
        <result column="id" property="id" />
        <result column="notice_id" property="NoticeId" />
    </resultMap>
  • Dao
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("system_notice_reader")
public class SystemNoticeReader {

    /**
     * null | system_notice_reader.id | @mbg.generated
     */
    @ApiModelProperty("null")
    @TableId
    private Long id;

    /**
     * 公告 ID | system_notice_reader.notice_id | @mbg.generated
     */
    @ApiModelProperty("公告 ID")
    private Long noticeId;

    /**
     * 已阅读商户 ID | system_notice_reader.merchant_id | @mbg.generated
     */
    @ApiModelProperty("已阅读商户 ID")
    private Long merchantId;

}
  • DaoCol:实体类字段对应的枚举类字段
public class SystemNoticeReaderCol {

	public static final String ID = "id";

	public static final String NOTICE_ID = "notice_id";

	public static final String MERCHANT_ID = "merchant_id";

}
  • DTO(VO):数据传输对象
@Data
@AllArgsConstructor
public class SystemNoticeReaderResponse {

    @ApiModelProperty("ID")
    private String id;
    @ApiModelProperty("阅读公告ID")
    private String NoticeId;

}
@Data
@AllArgsConstructor
public class SystemNoticeResponse {

    @ApiModelProperty("id")
    private Long id;
    @ApiModelProperty("标题")
    private String noticeTitle;
    @ApiModelProperty("内容")
    private String noticeContent;
    @ApiModelProperty("创建时间")
    private Date createAt;
    @ApiModelProperty("阅读状态, 0: 待阅读, 1: 已阅读")
    private Integer readStatus;
}

CURD接口

add
  • Controller
    @PostMapping("add")
    @ApiOperation("新增公告")
    @Logger(menu = "公告管理", action = "新增公告")
    public Result noticeAdd(@Validated @RequestBody SystemNoticeResponse insert) {
        systemNoticeService.addSystemNotice(insert);
        return Result.succ("添加成功");
    }
  • Service
    /**
     * 公告添加
     *
     * @param insert
     * @return
     */
    public SystemNotice addSystemNotice(SystemNoticeResponse insert) {
        SystemNotice notice = new SystemNotice(
                null,
                insert.getNoticeTitle(),
                insert.getNoticeContent(),
                new Date(),
                AuthContextHolder.getLoginManager().getUserRealName()
        );
        systemNoticeRepo.save(notice);
        return notice;
    }
delete
  • Controller
    @PostMapping("delete")
    @ApiOperation("删除公告")
    @Logger(menu = "公告管理", action = "删除公告")
    public Result noticeDelete(@Validated @RequestBody CommonRequestId request) {
        systemNoticeRepo.removeById(request.getId());
        return Result.succ("删除成功");
    }
update
  • Controller
    @PostMapping("update")
    @ApiOperation("编辑公告")
    @Logger(menu = "公告管理", action = "编辑公告")
    public Result noticeUpdate(@Validated @RequestBody SystemNoticeResponse insert) {
        systemNoticeService.updateSystemNotice(insert);
        return Result.succ("更新成功");
    }
  • Service
    /**
     * 编辑公告
     *
     * @param insert
     * @return
     */
    public SystemNotice updateSystemNotice(SystemNoticeResponse insert) {
        SystemNotice notice = systemNoticeRepo.getById(insert.getId());
        if (notice != null) {
            notice.setNoticeTitle(insert.getNoticeTitle());
            notice.setNoticeContent(insert.getNoticeContent());
            notice.setCreateAt(new Date());
            systemNoticeRepo.updateById(notice);
        }
        return notice;
    }
list
  • Controller
    @GetMapping("list")
    @ApiOperation("展示公告")
    @Logger(menu = "公告管理", action = "展示公告")
    public Result<PageResult<SystemNotice>> list(SystemNoticeQuery query) {
        Page<SystemNotice> systemNoticePage = systemNoticeRepo.systemNoticeQuery(query);
        return Result.succ(PageResult.toPage(systemNoticePage));
    }
insert
  • Controller
@PostMapping("insert")
@ApiOperation("已阅读")
@Logger(menu = "首页", action = "已阅读")
public Result noticeReader(@Validated @RequestBody CommonRequestId request) {
    systemNoticeService.SystemNoticeReader(request.getId());
    return Result.succ("已阅读");
}
  • Service
    /**
     * 公告 已阅读
     *
     * @param
     * @return
     */
    public SystemNoticeReader SystemNoticeReader(Long noticeId) {
        SystemNoticeReader notice = new SystemNoticeReader(
                null,
                noticeId,
                AuthContextHolder.getLoginMerchant().getId()
        );
        systemNoticeReaderRepo.save(notice);
        return notice;
    }

GetMapping和PostMapping辨析

  • @GetMapping:用于获取(查询)资源,不应该用于修改数据(数据库获取)
  • @PostMapping:用于创建资源,不应该用于查询数据(数据库编辑、修改)

Request和Response辨析

前端(客户端)—— 后端(服务器端)

  • Request(请求):客户端向服务器发送的一种信息,用于请求操作或获取资源( 前端 ==》后端 )
  • Response(响应):Response是服务器对客户端请求的回应,包含服务器处理结果的数据( 后端 ==》前端 )

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


在这里插入图片描述

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

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

相关文章

汽车电子AEC Q101车规认证FDD9507L-F085 P沟道MOS管

深力科带你了解关于汽车电子AEC Q101车规认证&#xff1f; 是一种针对分立半导体的可靠性测试认证程序&#xff0c;由汽车电子协会发布。这个认证程序主要是为了确保汽车电子产品在各种严苛的条件下能够正常工作和可靠运行。它包括了对分立半导体的可靠性、环境适应性、温度循…

配置文件和系统变量

文章目录 系统变量和配置文件1. 系统变量2. 配置文件的使用2.1 配置文件格式2.2 启动命令与选项组2.3 特定的MYSQL版本的专用选项组2.4 同一个配置文件中多个组的优先级2.5 命令行和配置文件中启动选项的区别 系统变量和配置文件 1. 系统变量 除了在用SET临时方式设置&#x…

【Vue】安装并使用vue-cli搭建SPA项目

目录 一、Vue-cli安装 1.1 什么是Vue-cli 1.2 安装Vue-cli 1.3 使用Vue-cli构建项目 二、SPA项目 2.1 导入、运行SPA项目 2.2 vue项目结构说明 2.3 .什么是*.vue文件 2.4 基于SPA项目完成路由 2.5 基于SPA项目完成嵌套路由 一、Vue-cli安装 1.1 什么是Vue-cli Vue CL…

ubuntu 配置NTP时间服务器

sudo apt update 显示秒&#xff08;进入Top Bar 打开second&#xff09; sudo apt install gnome-tweaks 安装ntp服务器 sudo apt install ntp 在服务端修改ntp配置开放客户端所在的网段 sudo gedit /etc/ntp.conf restrict 172.19.7.0 mask 255.255.255.0 nomodify notrap 重…

java - 散列算法 SHA-256 hash值计算

文章目录 前言java - 散列算法 SHA-256 hash值计算1. 散列算法是什么?2. 散列算法的主要特征是什么?3. 计算SHA-256值有没有可能重复4. SHA-256算法实现示例 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作…

Python实现MYSQL蜜罐

1 LOAD DATA INFILE介绍 首先开启一个Mysql&#xff0c;看一下mysql是如何读取主机文件的。 1.1 linux搭建mysql 1&#xff09;docker运行mysql 2&#xff09;启动Mysql docker run -itd…

【docker安装Mysql并配置主从复制】

Mysql主从复制 目的&#xff1a; 是为了后面naocs集群的服务配置做准备工作 准备工作 准备至少两台虚拟机或服务器&#xff0c;安装好了docker&#xff0c;找到他们的ip地址 后面操作都用xshell操作来代替 拉取并启动mysql镜像和容器 主机的命令为mysql01&#xff0c;对…

综述 | 实时三维形状测量技术的综述

原创 | 文 BFT机器人 随着人工智能和机器人技术的快速发展&#xff0c;实时三维形状测量技术变得愈发重要。由于机器人通常在动态环境中操作&#xff0c;因此机器人装备的三维形状测量技术需要能够实时从运动的物体中获取三维形状信息。未来的三维机器视觉技术实际上依赖于实时…

个人博客搭建记录

个人博客地址&#xff1a;www.jiasun.top 使用github pagehexo搭建&#xff0c;主题为fluid&#xff0c;搭建步骤参照&#xff1a;Github hexo 实现自己的个人博客、配置主题&#xff08;超详细&#xff09; 主题&#xff1a;https://hexo.fluid-dev.com/ 搭建时的问题&…

eNSP模拟器!通过Cloud云使本机与模拟器互通,成功通过ssh登陆设备!

首先配置云接口&#xff1a; 配置路由器IP地址&#xff1a; [Huawei]int g 0/0/0 [Huawei-GigabitEthernet0/0/0]ip ad 192.168.56.2 24 用本机去ping路由器&#xff0c;路由器成功与本机互通。 ssh登陆配置&#xff1a; [Huawei]user-interface vty 0 4 [Huawei-ui-vty0-4]…

计算物理专题----随机游走实战

计算物理专题----随机游走实战 Problem 1 Implement the 3D random walk 拟合线 自旋的 拟合函数&#xff08;没有数学意义&#xff09; 参数&#xff1a;0.627,3.336,0.603&#xff0c;-3.234 自由程满足在一定范围内的均匀分布以标准自由程为单位长度&#xff0c;…

ETHERCAT转MODBUS TCP/IP协议网关

产品介绍 JM-ECT-TCPIP是自主研发的一款EtherCAT从站功能的通讯网关。该产品主要功能是将EtherCAT网络和 TCP/IP 网络连接起来。 本网关连接到EtherCAT总线中做为从站使用&#xff0c;连接到 TCP/IP 网络中做为服务器或客户端使用。 产品参数 技术参数 u 网关做为EtherCAT网…

Docker容器数据持久化存储机制

这里写目录标题 一、Docker容器数据持久化存储介绍二、Docker容器数据持久化存储方式三、Docker容器数据持久化存储方式应用案例演示3.1 docker run -v3.1.1 创建了本地目录3.1.2 未创建本地目录 3.2 volumes3.2.1 创建数据卷3.2.2 使用数据卷 一、Docker容器数据持久化存储介绍…

Dynaform 7.0安装说明教程

Dynaform 7.0安装说明教程 1.安装ANSYS License Manager 2023R2 2.用有裂纹的程序文件夹覆盖原始<ANSYS Inc>程序文件夹&#xff08;默认设置为&#xff1a;C:\program Files\ANSYS Inc&#xff09; 3.运行程序>ANSYS&#xff0c;股份有限公司许可管理器>ANSYS许…

安装封箱机需要的条件

任何设备的安装都需要一定的场地条件&#xff0c;封箱机产品也不例外&#xff0c;对于初次使用封箱机的用户&#xff0c;我们会仔细提醒客户需要准备的条件&#xff0c;今天就把这些条件和大家分享一下&#xff0c;方便您今后更方便的使用封箱机产品。 1、适当的场地。用户在购…

【C++】C++11——构造、赋值使用条件和生成条件

移动构造和移动赋值生成条件移动构造和移动赋值调用逻辑强制生成默认函数的关键字default禁止生成默认函数的关键字delete 移动构造和移动赋值生成条件 C11中新增的移动构造函数和移动赋值函数的生成条件为&#xff1a; 移动构造函数的生成条件&#xff1a;没有自己实现的移动…

Redis GEO 类型与 API 结合,地理位置优化的绝佳实践

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

Linux下的网络编程——网络基础、socket编程(一)

前言&#xff1a; 前面我们学习了Linux的系统编程&#xff0c;从今天我们就要开始Linux网络编程的学习了&#xff0c;Linux网络编程中的知识点可能没有前面的Linux系统多一点&#xff0c;但是基础的网络知识我们还是需要了解的&#xff0c;并且网络编程中的socket编程的知识也…

打赏收款收银台多合一支付收款HTML源码

多合一打赏支付收款&#xff08;微信、QQ、支付宝&#xff09; 源码直接上传到服务器解压缩即可访问,或者用本地浏览器打开访问 PS&#xff1b;只需要将自己的收款二维码替换即可 该源码全开源无加密&#xff0c;所有操作均在本地无需调用外部资源防止失效&#xff01; 源码…