理清SpringBoot CURD处理逻辑、顺序

2023-09-15 10:38:35

在这里插入图片描述

💗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是服务器对客户端请求的回应,包含服务器处理结果的数据( 后端 ==》前端 )

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


在这里插入图片描述

更多推荐

干洗店洗鞋店线上下单小程序方便快捷

在线下单是干洗店小程序最直接满足顾客使用需求的一项功能,让顾客能够直观了解到不同规格不同方式清洁衣物干洗的价格并且能够直接在线下单,能够极大缩短消费环节,提升下单可能性,管理后台还能够同步记录顾客订单数据,对门店的日常管理也大有帮助。上门取送的功能也是一个十分适合添加在干洗店小程序里的模块,对于时间或者交通不便的用户来

蓝牙技术|多快好省的苹果Find My查找定位方案商:北京自在科技

在电子市场里,各种蓝牙定位器品牌争奇斗艳,例如国外的TileMate和Slim,三星的GalaxySmartTag和GalaxySmartTag+,Chipolo的ONESpot,还有苹果的AirTag等等。而国内也有着不少优秀的品牌,如Nutale的Air和Pro,VanMoof最S3及X3电动单车,Belkin的S

yamot:一款功能强大的基于Web的服务器安全监控工具

关于yamotyamot是一款功能强大的基于Web的服务器安全监控工具,专为只有少量服务器的小型环境构建。yamot只会占用非常少的资源,并且几乎可以在任何设备上运行。该工具适用于Linux或BSD,当前版本暂不支持Windows平台。比如说,广大研究人员可以使用yamot来监控在家运行的RaspberryPi服务器。

leetcode21合并两个有序链表

题目:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4],l2=[1,3,4]输出:[1,1,2,3,4,4]示例2:输入:l1=[],l2=[]输出:[]示例3:输入:l1=[],l2=[0]输出:[0]提示:两个链表的节点数目范围是[0,5

web端程序访问过慢时如何判断问题

当Web端程序访问过慢时,可以按照以下步骤进行问题判断和排查:1.确认问题:确认Web端程序访问真的过慢,可以通过以下方法进行测试:在不同浏览器和设备上测试访问速度,以排除个别设备或浏览器的问题。在不同时间段进行测试,以排除网络高峰期的影响。确认网络连接是否稳定,可以尝试在多个网络环境下进行测试。2.检查服务器性能:如

3D医学影像PACS系统源代码

一、系统概述3D医学影像PACS系统,它集影像存储服务器、影像诊断工作站及RIS报告系统于一身,主要有图像处理模块、影像数据管理模块、RIS报告模块、光盘存档模块、DICOM通讯模块、胶片打印输出等模块组成,具有完善的影像数据库管理功能,强大的图像后处理功能,提高了临床诊断准确率。二、三维影像重建支持三维影像处理功能;

代码签名:保护你的软件的安全性和完整性

代码签名是一种数字签名技术,用于保护软件的完整性和身份。它通过使用一个密钥对软件代码进行签名,确保代码在下载和安装过程中没有被篡改。代码签名证书是一种数字证书,用于证明代码签名者的身份和代码的完整性。以下是代码签名证书如何保护您的软件的详细说明:1,确保软件的完整性:代码签名证书可以确保您的软件在下载和安装过程中没有被

【cmake开发(5)】cmake 设置常规变量、环境变量、内置变量;cmake 带参数编译和 -D 选项; c++源码通过-D 选项的宏定义进行条件编译

文章目录一、CMake变量的定义1.1定义常规变量1.2打印变量1.3环境变量1.4持久缓存1.5持久缓存原理1.6内置变量二、带参数编译2.1我们可以看到了-D选项,一般配合option命令2.2c++源码通过-D选项的宏定义进行条件编译参考在【cmake开发(3)】中,我们设置了makeinstall安装目录。这就

「网页开发|后端开发|Flask」08 python接口开发快速入门:技术选型&写一个HelloWorld接口

本文主要介绍为网站搭建后端时的技术选型考虑,以及通过写一个简单的HelloWorld接口快速了解前端和后端交互的流程。文章目录本系列前文传送门一、场景说明二、后端语言技术选型三、后端框架技术选型Django特点Flask特点FastAPI特点Tarnado特点四、用Flask先来个最简单的HelloWorld五、在前端

静态代理和动态代理

一、静态代理代理模式(ProxyPattern)是一种结构型设计模式,它的概念很简单,它通过创建一个代理对象来控制对原始对象的访问。代理模式主要涉及两个角色:代理角色和真实角色。代理类负责代理真实类,为真实类提供控制访问的功能,真实类则完成具体的业务逻辑。这样,当我们不方便或者不能直接访问真实对象时,可以通过代理对象来

Mysql----锁

文章目录锁概述全局锁全局锁概述全局锁操作表级锁表级锁表锁表级锁元数据锁表级锁意向锁行级锁行级锁行锁行级锁间隙锁&临键锁锁概述是什么是计算机协调多个进程或线程并发访问某一资源的机制。意义在数据库中,数据是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发

热文推荐