苍穹外卖-day03-菜品分页查询模块学习笔记
苍穹外卖-day03-菜品分页查询模块学习笔记【作者说在这个模块中我了解到了Serializable 接口与implements 关键字等序列化的本质这也是面试的高频考点还有Mapper 层动态 SQL 开发以及最后关于Apifox的使用流程这是我以后调试接口的必要操作这个app具有多功能的接口调试极大地简化了调试接口的困难我仍在逐步学习中加油】一、序列化与 Serializable 接口DTO/VO 必备基础核心定义Serializable 接口Java 的标记接口接口内无任何方法作用是给类打上「可序列化」标签相当于给对象颁发 “运输许可证”。implements 关键字Java 关键字作用是让类实现 / 认领这个接口完成序列化权限的声明。序列化本质就是把内存中 JVM 堆里的「活对象」比如 DTO、VO、实体类转换成可存储 / 传输的「静态字节流 / JSON 格式」反序列化则是收到数据后把字节流重新拼装成可用的 Java 对象--------就像你拼好的乐高机甲只能在当前桌面JVM 内存展示没法直接快递。序列化就是把机甲拆解成有序零件字节流方便运输 / 存入 Redis 缓存反序列化就是收到零件后重新拼回完整机甲Java 对象。而implements Serializable就是给机甲贴上「允许拆解运输」的标识没有这个标识就无法完成拆解。关键拓展面试 / 开发高频考点1.为什么 DTO/VO 必须实现序列化苍穹外卖中DTO 用于接收前端请求参数、VO 用于返回给前端响应数据这些对象需要在网络中传输前端↔后端或存入 Redis缓存如登录态存储必须通过序列化转换为字节流才能完成传输 / 存储。2.序列化 IDserialVersionUID补充建议手动指定private static final long serialVersionUID 1L;避免 JVM 自动生成的 ID在类结构修改后发生变化导致反序列化失败比如修改 DTO 属性后旧缓存数据无法反序列化。 常见误区3.不是所有类都需要序列化仅用于后端内部逻辑处理、不参与网络传输 / 缓存的工具类无需实现 Serializable 接口。二、DTO 设计核心规范核心要求DTO数据传输对象中封装的属性必须与需求设计的接口参数一一对应做到字段名、类型完全匹配避免参数接收失败。DTO 与实体类的区分实体类Entity对应数据库表结构DTO 仅用于接口参数接收不要直接用实体类作为入参避免暴露数据库敏感字段如 password、id 等。参数校验增强可结合NotNull、Min等校验注解对分页参数page、pageSize做合法性校验避免非法参数导致 SQL 报错。三、Mapper 层动态 SQL 开发分页查询核心实现核心要点DishMapper 中的 SQL 语句是动态 SQL需要对每一个查询字段做非空判断避免无效条件拼接导致查询异常。必须保证SQL 字段别名与 DTO/VO 属性名一一对应否则 MyBatis 无法自动封装结果集。用concat函数实现动态模糊查询用order by指定排序规则菜品按create_time排序保证最新数据优先展示。动态 SQL 标签使用用标签做非空判断标签自动处理多余的and/or标签处理多条件互斥场景避免手动拼接 SQL 的语法错误。分页插件集成PageHelper苍穹外卖中使用 PageHelper 分页插件无需手动编写limit分页语句只需在 Service 层调用PageHelper.startPage(page, pageSize)即可自动分页简化开发。示例代码DishMapper.xml 动态 SQL?xml version1.0encodingUTF-8?!DOCTYPEmapperPUBLIC-//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.sky.mapper.DishMapper!--菜品分页查询支持名称模糊查询分类状态筛选左联分类表获取分类名--select idpageresultTypecom.sky.vo.DishVO!--ddish菜品表 ccategory分类表起别名categoryName与DishVO字段对应--select d.*,c.name as categoryName from dish d left join category c on d.category_idc.id!--where标签自动处理多余and避免where11写法--where!--名称非空则拼接模糊查询concat防SQL注入--iftestname ! null and name ! and d.name likeconcat(%,#{name},%)/if!--分类ID非空则精确匹配多表字段必须加表别名--iftestcategoryId ! nulland d.category_id#{categoryId}/if!--状态非空则精确匹配售卖状态--ifteststatus ! nulland d.status#{status}/if/where!--分页必加排序按创建时间倒序保证数据不乱--order by d.create_time desc/select/mapper四、API Fox 接口调试全流程实操步骤优化 拓展核心步骤前置条件保证 Spring Boot 项目正常启动控制台打印Started SkyApplication8080 端口正常监听。获取 Token调用「员工登录」接口输入管理员账号密码发送请求后从响应体中获取token字段。全局配置 Token点击右上角「环境管理」→「全局参数」新增Header类型参数key为tokenvalue为刚获取的 Token保存后所有接口自动携带该请求头无需手动添加。测试分页接口配置分页参数page1、pageSize5发送请求验证接口是否正常返回数据。补充拓展调试避坑 效率提升5.1 Token 过期处理苍穹外卖默认 Token 有效期为 2 小时过期后需重新调用登录接口获取新Token更新全局参数即可可在环境管理中配置「环境变量」用{{token}}占位符每次更新后全局生效无需逐个接口修改。5.2接口鉴权排查若接口返回空数据 / 401无权限先检查「实际请求」标签中的请求头确认token是否正常携带部分接口虽标注「无需鉴权」但后端代码仍做了登录校验需手动添加Token。5.3接口用例管理可在 API Fox中为分页查询接口创建用例保存不同参数如page1,pageSize10、name宫保模糊查询方便后续回归测试提升调试效率。5.4参数校验调试可测试非法参数如page0、pageSize-1验证后端参数校验逻辑是否生效保证接口健壮性。五、高频面试考点拓展分页查询的性能优化1.大数据量分页避免limit 100000,10这种深分页可通过「主键分页」where id 最后一条id limit 10提升性能2.索引优化为查询条件name、category_id、status、排序字段create_time建立联合索引避免全表扫描3. 缓存优化对高频访问的分页数据如首页菜品列表用 Redis 做缓存减少数据库压力。动态 SQL 的优缺点优点灵活适配多条件查询减少硬编码提升代码可维护性缺点复杂动态 SQL 可读性差调试难度高需注意 SQL注入风险MyBatis 的#{} 会预编译避免注入。序列化的其他应用场景除了网络传输还用于对象持久化存入文件 / 数据库、Redis 缓存对象、RMI 远程调用等。六、笔记总结本次菜品分页查询学习我掌握了 DTO 序列化传输、MyBatis 动态 SQL 编写及多表联查要点通过与实现灵活条件筛选规范字段别名保证数据封装。在 APIFox 中完成项目启动、token 获取与全局配置、接口调试全流程学会处理 token 过期与权限校验问题实现前后端联调落地。