杂项6

简介: 本文介绍了软件开发中的多个关键技术点,包括数据回显、分页查询、AOP操作、文件上传、自增ID获取以及单表与多表更新的区别。内容涵盖了从前端到后端的完整流程,重点解析了分页实现、数据一致性处理及复杂表操作的优化方法,适用于Java Web开发场景。

回显

1.根据id进行查询

2.修改数据

点击修改,实质上id传过了,会先进行id的查询,就造成了数据的回显

与分页不同,分页是两个结果的判断,回显是先后操作

分页步骤

1.接收参数controller(返回pageresult结果)

2.serviceimpl

   步骤

2.1  使用pagehelper进行分页(传入controller接受的 page,pagesize)

2.2   调用mapper层方法(分页查询本质上返回的是一个实体类的集合)

2.3 强转为page类型(方便传递 total result(查询的结果))

2.4 传回 pageresult的对象(把 total result传入)

3.调用mapper层方法

注入

controller

service实现类

mapper接口

aop理解如何获取方法,操作步骤

1.定义注解

2.把注解放在要进行aop的类

3.通过around进行切入

4.如何获取方法的信息(详细。所有);

5.使用around时,必须使用proceed显示调用执行,否则不会生效

图片上传

注解只能使用@RequestParam@ModelAttribute(无论请求参数在哪里)

  • 文件上传必须用 @RequestParam @ModelAttribute,因为它们支持 multipart/form-data
  • 如果需要同时处理 JSON 数据,有两种方案:
  1. 将 JSON 作为普通表单字段(字符串)传递,手动解析(如示例 2)。
  2. 分两次请求:先上传文件,再提交 JSON 数据。


分页

  1. 正常返回结果(调用servce)
  2. service 层返回结果是pageResult(自定义,不用hutool)

2.1先使用pagehelp进行数据统计,后面调用mapper获得所要展示的产品的集合

2.2把得到集合用page转化

2.3 把返回total和rows

3.mapper层查询,要判断(根据复选框)

示例

@Override
public PageResult FenYeQuery(DishPageQueryDTO dishPageQueryDTO) {
  Page<Object> objects = PageHelper.startPage(dishPageQueryDTO.getPage(), dishPageQueryDTO.getPageSize());
  List<Dish> dishes = dishMapper.fenYeQuery(dishPageQueryDTO);
        Page<Dish> dishPage=(Page<Dish>) dishes;
  return   new PageResult(dishPage.getTotal(),dishPage.getResult());
}


如何获取自增id

示例: 员工表中包括经历表(员工表是自增id) 要在插入员工的语句中添加useGeneratedKeys="true" keyProperty="id",后面才可以直接获取自增的id

通过一个表的id去查询另一个表是否有匹配的数据(一般是e_id)

方法1:直接返回结果(就是用包装类型integer接收)

要先判断是否为null,再判断是否大于0(e_id都是大于0的)

方式2:使用统计(用count)(优解)

count(*) 的特性:SQL 的 count(*) 函数会统计符合条件的记录数,无论是否存在匹配的记录,结果都至少为 0不会返回 null

原因:

  • 当有匹配记录时setmeal_id是具体的整数(如 1、2),MyBatis 会将其映射为Integer对象(值为 1、2 等)。
  • 当无匹配记录时:查询结果是空集(没有任何行),此时 MyBatis 无法获取到setmeal_id的值,会将返回值映射为null(因为没有数据可填充)。

关键点数据库中 “没有查询到数据” 和 “查询到的值为 0” 是完全不同的情况:

  • 前者是 “无结果”,映射为null
  • 后者是 “有结果但值为 0”,映射为Integer 0

针对更新操作

单表

多表(先回显此时所有的数据已经准备好,如果要修改某一项,那么其他的数据会再传输一份)

比如: 信息是:   a b  要修改b->c  第一步回显 显示出 a b 第二步 在前端修改 b->c  最终结果 是 a c 然后点击修改传递的是全部的数据,不是只传递修改的部分

单表更新 vs 多表更新的核心差异

场景

单表更新(如只改套餐名称)

多表更新(如改套餐名称 + 改关联餐品)

涉及表

仅 1 个表(如套餐表)

至少 2 个表(套餐表 + 套餐 - 餐品关联表)

核心操作

直接根据主键更新字段(如update 套餐表 set 名称=新名称 where id=xxx

1. 更新主表(套餐表)字段;
2. 处理关联表(新增 / 删除 / 修改关联关系)

复杂度

低(只需保证单条记录正确)

高(需保证主表和关联表数据 “匹配”,比如关联表不能出现主表不存在的套餐 ID)

一致性要求

单表内数据正确即可

必须保证 “主表改了,关联表也同步改”,否则会出现 “套餐存在但关联餐品丢了” 或 “关联餐品指向不存在的套餐” 等问题

service 的逻辑拆解如下,重点看 “主表” 和 “关联表” 的不同处理方式:

  • 主表的信息是 “单条独立记录”,改的时候直接改对应字段就行;
  • 关联表的信息是 “一堆关系的集合”,改的时候很难精确比对每一条关系,所以用 “全删全插” 的方式保证结果正确,还省事儿。
相关文章
subject may not be empty | type may not be empty
subject may not be empty | type may not be empty
580 0
|
JavaScript 前端开发 开发者
正则表达式深度解析:斜杠的妙用
【2月更文挑战第29天】
2372 0
正则表达式深度解析:斜杠的妙用
|
小程序 JavaScript
小程序自定义弹窗禁止底部内容滚动(滚动穿透问题)
小程序自定义弹窗禁止底部内容滚动(滚动穿透问题)
2002 0
|
4月前
|
消息中间件 存储 缓存
再次了解kafka
Kafka通过offset机制解决消息重复消费问题,支持手动提交偏移量及唯一ID去重。它保证分区内的消息顺序消费,结合集群、副本与重平衡实现高可用。高性能设计包括顺序读写、分区、页缓存、零拷贝等。数据清理依赖保留时间或大小策略,点对点和发布订阅模式则通过消费者组实现。
|
4月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
4月前
|
存储 缓存 Linux
CPU上下文切换的原理及其在系统调用和进程切换中的应用
本内容深入解析了CPU上下文切换的原理及其在系统调用和进程切换中的应用。详细说明了CPU寄存器、程序计数器在任务切换中的作用,以及系统调用与进程上下文切换的区别。同时探讨了上下文切换带来的性能开销,涉及TLB和虚拟内存管理机制,帮助理解操作系统如何高效调度进程。
|
4月前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
4月前
|
负载均衡 网络性能优化
了解EMQ
EMQ通过MQTT协议的QoS机制保障消息可靠传输,支持QoS 0、1、2三个等级,分别实现消息最多一次、至少一次和恰好一次传递。对于延迟消息,EMQ X支持通过特殊主题前缀`$delayed/{DelayInterval}`实现延迟发布。点对点通信可通过不带群组的共享订阅(如`$queue/t/1`)实现,结合负载均衡策略如随机、轮询等,确保消息仅由一个订阅者接收;发布订阅模式则通过带群组的共享订阅(如`$share/组名称/t/1`)实现,确保每组一个订阅者收取消息。
|
4月前
|
Docker 容器
初始ollama
Ollama 按需加载模型,不持续运行,闲置时自动卸载,节省内存。模型响应请求时驻留内存,保留时间由 OLLAMA_KEEP_ALIVE 控制。类似 Docker 部署方式,但无单模型启停命令,默认时间内自动停止。可间接通过停止服务或配置多端口实现管理。
|
4月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。