视频加载失败

JavaWeb Day04:条件分页、事务新增与本地上传

649 字
3 分钟
JavaWeb Day04:条件分页、事务新增与本地上传

代码结构#

层类/方法锚点
POJOEmpQueryParam查询参数对象封装:page/pageSize 字段默认值(1/10)+ name/gender/begin/end;@DateTimeFormat(pattern="yyyy-MM-dd") 绑定 LocalDate
ControllerEmpController.page(EmpQueryParam)散参(@RequestParam×5)改造为 POJO 对象收参,@GetMapping 无路径匹配 /emps
ServiceEmpServiceImpl.page(EmpQueryParam)PageHelper:PageHelper.startPage(page, pageSize) → 查询 → (Page<Emp>) list 强转取 getTotal()/getResult(),替代手写 count + LIMIT 两步
MapperEmpMapper.list(EmpQueryParam)方法签名收对象;SQL 由 XML 提供(条件动态拼接)
ServiceEmpServiceImpl.save(Emp)@Transactional(rollbackFor = Exception.class):insert 员工 + 工作经历 insertBatch;finally 里记操作日志
MapperEmpMapper.insert@Options(useGeneratedKeys = true, keyProperty = "id") 主键回填:insert 后 emp.getId() 直接可用
MapperEmpExprMapper.insertBatch工作经历批量插入(List<EmpExpr>);插入前 expr.setEmpId(emp.getId()) 补外键
POJOEmpLog / EmpLogService / EmpLogMapper.insert操作日志:emp_log(operate_time, info) 表 + Service/Mapper 三层
ControllerUploadController.upload本地上传:MultipartFile file 收文件 → 校验目录 dir.mkdirs() → 原后缀 + UUID 新文件名 → file.transferTo() 落盘

核心结论#

  1. POJO 对象收参:多个查询参数(page/pageSize/name/gender/begin/end)收进一个 EmpQueryParam,@DateTimeFormat 解决 LocalDate 字符串绑定;接口签名变干净,也便于复用,是分页+条件查询接口的标准做法。
  2. PageHelper 分页 = 插件物理分页:startPage 把分页参数放进 ThreadLocal,MyBatis 拦截器在执行 SQL 前重写语句,按方言追加 limit(物理分页,效果与手写 LIMIT 一致,省去两步手写);查询后强转 Page 取 total/result。强转依赖 PageHelper 返回的代理对象,普通 List 不能这么转。
  3. @Transactional(rollbackFor = Exception.class):默认只对 RuntimeException/Error 回滚,Checked Exception 会静默提交;显式 rollbackFor 把范围扩到全部 Exception,防止 SQL/IO/自定义异常写入脏数据。
  4. useGeneratedKeys 主键回填:@Options(useGeneratedKeys=true, keyProperty="id") 让数据库自增主键写回 emp.id,新增后立即能拿到新 id,才能给工作经历设置 empId 外键;批量插入的主键回填同理。
  5. finally 记日志的事务伏笔:save 的 finally 里调用 empLogService.insertLog(未设独立传播级别),日志插入与 save 同处一个事务——业务一旦回滚,日志也一起回滚消失。解决思路是给日志方法指定事务传播行为 REQUIRES_NEW,让它在独立事务中提交。
  6. 上传防坑三件套:目录先建(mkdirs)→ UUID 唯一名(防重名覆盖、中文乱码与路径穿越,绝不拼用户原文件名)→ transferTo 落盘;集群场景改为读 InputStream 推送对象存储。

踩坑与注意#

  • PageHelper 强转 (Page<Emp>) list 依赖插件的代理返回值,对普通 List 强转会抛 ClassCastException——分页必须走 startPage 之后的第一条查询。
  • expr.setEmpId(emp.getId()) 必须发生在 insert 之后(主键回填完成后),顺序反了拿不到 id。
  • 上传失败被 catch 后仍返回 success(),异常被吞掉——可用全局异常处理器统一返回错误响应。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
JavaWeb Day04:条件分页、事务新增与本地上传
https://ryuki.icu/posts/javaweb-day04/
作者
RK
发布于
2026-08-14
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
RK
Long may the sunshine
公告
Long may the sunshine
分类
标签
最新动态
站点天气
天气加载中…
站点统计
文章
27
分类
6
标签
59
总字数
39,139
篝火已燃
0 天
最后活动
0 天前
每日一签