理清SpringBoot CURD处理逻辑、顺序

简介: 理清SpringBoot CURD处理逻辑、顺序


理清SpringBoot CURD处理逻辑、顺序

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

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


目录
相关文章
|
3月前
|
Java 测试技术 API
SpringBoot单元测试快速写法问题之复杂的业务逻辑设计有效的单元测试如何解决
SpringBoot单元测试快速写法问题之复杂的业务逻辑设计有效的单元测试如何解决
|
4月前
|
存储 Java
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
软件开发常用之SpringBoot文件上传接口编写(中),一本书,代码大全(里面有很多代码重构的方法),屎山代码的原因是不断追加逻辑,在错误代码上堆积新的功能,在写完逻辑之后去思考一下,逻辑合理不
|
消息中间件 Java Kafka
SpringBoot中使用异步方法优化Service逻辑,提高接口响应速度
异步方法适用于逻辑与逻辑之间可以相互分割互不影响的业务中, 如生成验证码和发送验证码组成的业务, 其实无需等到真正发送成功验证码才对客户端进行响应, 可以让短信发送这一耗时操作转为异步执行, 解耦耗时操作和核心业务;
|
6月前
|
机器学习/深度学习 运维 Java
江帅帅:Spring Boot 底层级探索系列 02 - 自动配置的底层逻辑
江帅帅:Spring Boot 底层级探索系列 02 - 自动配置的底层逻辑
47 0
|
设计模式 Java Spring
Spring Boot使用责任链模式优化业务逻辑中的if-else代码
在开发过程中,我们经常会遇到需要根据不同的条件执行不同的逻辑的情况。传统的做法是使用if-else语句来进行条件判断,但是随着业务逻辑的复杂化,if-else语句会变得越来越臃肿,难以维护和扩展。这时候,我们可以考虑使用责任链模式来优化代码结构,使得代码更加清晰、可扩展和易于维护。
|
6月前
|
缓存 前端开发 Java
spring boot3登录开发-3(账密登录逻辑实现)
spring boot3登录开发-3(账密登录逻辑实现)
143 1
|
JSON 前端开发 Java
Spring Boot之Controller控制器:实现Web请求处理与业务逻辑分离
本篇详细介绍了Spring Boot中的Controller控制器的作用、用法和最佳实践。Controller是负责处理Web请求和响应的核心组件,能够将前端的HTTP请求映射到相应的业务逻辑处理,并返回适当的响应。通过一个简单的示例,展示了如何创建和配置Controller,并使用不同类型的注解来映射请求。还介绍了如何处理请求参数、路径变量,并展示了Controller方法返回不同类型的数据和视图的方式。通过学习本文内容,读者可以更好地理解和使用Spring Boot中的Controller,从而构建出灵活、高效的Web应用,提供优质的用户体验。
1515 1
SpringBoot 实战:国际化组件 MessageSource 执行逻辑与源码
本章我们一起看下 ResourceBundleMessageSource 和 ReloadableResourceBundleMessageSource 的执行逻辑。SpringBoot 的 MessageSource 组件有很多抽象化,源码看起来比较分散,所以本文会通过流程图的方式进行讲解。
|
Java 数据库连接 Spring
spring boot 初始化bean的时候自定义逻辑
spring boot 初始化bean的时候自定义逻辑
|
存储 NoSQL 关系型数据库
springboot下MongoDB的curd及MongoDB,Redis,MySQL的选择
# 何时使用Redis,MySQL和MongoDB MongoDB,MySQL和Redis都是可用于存储和管理数据的数据库管理系统。这些系统中的每一个都有其独特的特性和功能,具体选择哪一种数据库,取决于具体需求的要求。 以下是何时使用这些数据库管理系统的一些一般准则: - MongoDB:MongoDB是一个NoSQL数据库系统,这意味着它旨在处理大量的非结构化数据。它特别适合存储不适合表的数据,例如具有嵌套结构的数据或经常更改的数据。MongoDB还以其水平可扩展性而闻名,这意味着它可以轻松处理大量数据而不会牺牲性能。 - MySQL:MySQL是一种流行的关系数据库管理系统。