一文彻底理清SpringBoot CURD处理逻辑、顺序

 更新时间:2023年10月14日 11:36:46   作者:wei_shuo  
这篇文章主要给大家介绍了关于如何一文彻底理清SpringBoot CURD处理逻辑、顺序的相关资料,CURD是一个数据库技术中的缩写词,一般的项目开发的各种参数的基本功能都是CURD,文中通过代码介绍的非常详细,需要的朋友可以参考下

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

总结 

到此这篇关于SpringBoot CURD处理逻辑、顺序的文章就介绍到这了,更多相关SpringBoot CURD处理逻辑顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot+Jackson自定义注解数据脱敏的项目实践

    Springboot+Jackson自定义注解数据脱敏的项目实践

    数据脱敏可以对敏感数据比如 手机号、银行卡号等信息进行转换或者修改,本文主要介绍了Springboot+Jackson 自定义注解数据脱敏,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 关于Java中常见的负载均衡算法

    关于Java中常见的负载均衡算法

    这篇文章主要介绍了关于Java中常见的负载均衡算法,负载平衡是一种电子计算机技术,用来在多个计算机、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的,需要的朋友可以参考下
    2023-08-08
  • springboot接入netty实现在线统计人数

    springboot接入netty实现在线统计人数

    本文主要介绍了springboot接入netty实现在线统计人数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • 使用Java实现解析Excel公式

    使用Java实现解析Excel公式

    在日常工作中,我们经常需要在Excel中使用公式对表中数据进行计算和分析,所以本文小编主要来和大家介绍一下如何在Java中实现解析Excel公式,感兴趣的可以了解下
    2024-02-02
  • 通过JWT来解决登录认证问题的方案

    通过JWT来解决登录认证问题的方案

    Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC7519),该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景,本文给大家介绍了如何通过 JWT 来解决登录认证问题,需要的朋友可以参考下
    2024-12-12
  • 深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    深入浅析Java中Static Class及静态内部类和非静态内部类的不同

    上次有朋友问我,java中的类可以是static吗?我给他肯定的回答是可以的,在java中我们可以有静态实例变量、静态方法、静态块。当然类也可以是静态的,下面小编整理了些关于java中的static class相关资料分享在脚本之家平台供大家参考
    2015-11-11
  • StackTraceElement获取方法调用栈信息实例详解

    StackTraceElement获取方法调用栈信息实例详解

    这篇文章主要介绍了StackTraceElement获取方法调用栈信息实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • MyEclipse设置Console输出到文件的实现方法

    MyEclipse设置Console输出到文件的实现方法

    下面小编就为大家带来一篇MyEclipse设置Console输出到文件的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • JavaWeb学习笔记之Filter和Listener

    JavaWeb学习笔记之Filter和Listener

    这篇文章主要给大家介绍了关于JavaWeb学习笔记之Filter和Listener的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • SpringBoot 搭建架构5种方法示例详解

    SpringBoot 搭建架构5种方法示例详解

    SpringBoot是基于Spring框架的便捷开发框架,通过约定优于配置实现快速构建独立应用,文章介绍了五种搭建SpringBoot项目的方法,包括使用IntelliJ IDEA、Spring官网、阿里云官网以及将现有Maven项目转换为SpringBoot项目,感兴趣的朋友跟随小编一起看看吧
    2025-03-03

最新评论