JavaWeb Day04:条件分页、事务新增与本地上传
649 字
3 分钟
JavaWeb Day04:条件分页、事务新增与本地上传
代码结构
| 层 | 类/方法 | 锚点 |
|---|---|---|
| POJO | EmpQueryParam | 查询参数对象封装:page/pageSize 字段默认值(1/10)+ name/gender/begin/end;@DateTimeFormat(pattern="yyyy-MM-dd") 绑定 LocalDate |
| Controller | EmpController.page(EmpQueryParam) | 散参(@RequestParam×5)改造为 POJO 对象收参,@GetMapping 无路径匹配 /emps |
| Service | EmpServiceImpl.page(EmpQueryParam) | PageHelper:PageHelper.startPage(page, pageSize) → 查询 → (Page<Emp>) list 强转取 getTotal()/getResult(),替代手写 count + LIMIT 两步 |
| Mapper | EmpMapper.list(EmpQueryParam) | 方法签名收对象;SQL 由 XML 提供(条件动态拼接) |
| Service | EmpServiceImpl.save(Emp) | @Transactional(rollbackFor = Exception.class):insert 员工 + 工作经历 insertBatch;finally 里记操作日志 |
| Mapper | EmpMapper.insert | @Options(useGeneratedKeys = true, keyProperty = "id") 主键回填:insert 后 emp.getId() 直接可用 |
| Mapper | EmpExprMapper.insertBatch | 工作经历批量插入(List<EmpExpr>);插入前 expr.setEmpId(emp.getId()) 补外键 |
| POJO | EmpLog / EmpLogService / EmpLogMapper.insert | 操作日志:emp_log(operate_time, info) 表 + Service/Mapper 三层 |
| Controller | UploadController.upload | 本地上传:MultipartFile file 收文件 → 校验目录 dir.mkdirs() → 原后缀 + UUID 新文件名 → file.transferTo() 落盘 |
核心结论
- POJO 对象收参:多个查询参数(page/pageSize/name/gender/begin/end)收进一个
EmpQueryParam,@DateTimeFormat解决 LocalDate 字符串绑定;接口签名变干净,也便于复用,是分页+条件查询接口的标准做法。 - PageHelper 分页 = 插件物理分页:
startPage把分页参数放进 ThreadLocal,MyBatis 拦截器在执行 SQL 前重写语句,按方言追加limit(物理分页,效果与手写 LIMIT 一致,省去两步手写);查询后强转Page取 total/result。强转依赖 PageHelper 返回的代理对象,普通 List 不能这么转。 - @Transactional(rollbackFor = Exception.class):默认只对
RuntimeException/Error回滚,Checked Exception 会静默提交;显式rollbackFor把范围扩到全部 Exception,防止 SQL/IO/自定义异常写入脏数据。 - useGeneratedKeys 主键回填:
@Options(useGeneratedKeys=true, keyProperty="id")让数据库自增主键写回emp.id,新增后立即能拿到新 id,才能给工作经历设置empId外键;批量插入的主键回填同理。 - finally 记日志的事务伏笔:
save的 finally 里调用empLogService.insertLog(未设独立传播级别),日志插入与 save 同处一个事务——业务一旦回滚,日志也一起回滚消失。解决思路是给日志方法指定事务传播行为REQUIRES_NEW,让它在独立事务中提交。 - 上传防坑三件套:目录先建(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/相关文章智能推荐
1
JavaWeb Day03:Tlias 员工管理之分页查询
JavaWeb员工分页查询接口实现:LIMIT 物理分页、PageResult 泛型封装与 left join 关联部门名
2
JavaWeb Day07:项目部署与 Docker 基础
JavaWebDocker 镜像、容器、仓库与分层存储概念,常用命令、数据卷、Dockerfile 与 Compose,以及三容器项目部署链路
3
JavaWeb Day01:SpringBoot 入门与 MyBatis 注解开发
JavaWebSpringBoot Web 快速入门、三层分层与 IoC/DI 解耦、原生 JDBC、MyBatis 注解开发与 MySQL 基础。
4
JavaWeb Day05:全局异常、AOP 日志与管理模块
JavaWeb全局异常处理器与 AOP 操作日志切面,以及班级管理、学员管理和报表统计的业务实现
5
JavaWeb Day02:MyBatis XML 开发与 tlias 部门管理
JavaWebMyBatis XML 方式开发、tlias 部门管理三层 CRUD 实战与 SLF4J 日志配置。
随机文章随机推荐





















