1)删除员工(批量删除=单删的超集)
接口
DELETE /emps- 参数:
ids(可传 1 个或多个)
Controller 两种接法(推荐 List)
- 数组:
Integer[] ids - 集合(推荐) :
@RequestParam List<Integer> ids
Service(必须事务)
删除要操作两张表:
emp(员工基本信息)emp_expr(工作经历)
@Transactional
public void deleteByIds(List<Integer> ids){
empMapper.deleteByIds(ids);
empExprMapper.deleteByEmpIds(ids);
}
Mapper(foreach 批量 in)
delete from emp where id in (...)delete from emp_expr where emp_id in (...)
重点:MyBatis
<foreach collection="ids" item="id">
2)修改员工(两步:查询回显 + 保存更新)
2.1 查询回显(根据 ID 查详情)
接口
GET /emps/{id}
思路
- 一对多:
emp+emp_expr - 用 left join 一条 SQL 查出主表 + 多条经历
MyBatis 重点:resultMap + collection
- 一对多必须用
<resultMap>手动映射 <collection property="exprList" ofType="EmpExpr">封装经历列表
口诀:简单映射用 resultType;字段/结构复杂用 resultMap
2.2 保存修改(更新主表 + 重建经历)
接口
PUT /emps@RequestBody Emp emp
核心策略(讲义用的是“先删再增”)
update emp(更新基本信息,补updateTime)delete emp_expr where emp_id = ?(删除旧经历)insertBatch exprList(插入新经历)
必须加事务:
@Transactional
public void update(Emp emp){
empMapper.updateById(emp);
empExprMapper.deleteByEmpIds(List.of(emp.getId()));
empExprMapper.insertBatch(exprList);
}
Mapper 更新(动态 SQL)
<set> + <if>只更新有值的字段,避免把字段更新成 null
3)异常处理(统一返回 Result)
问题
比如手机号唯一约束冲突时,框架默认返回 500,前端拿不到你们约定的 Result。
推荐方案:全局异常处理器
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Result ex(Exception e){
e.printStackTrace();
return Result.error("对不起,操作失败,请联系管理员");
}
}
重点记两个注解:
@RestControllerAdvice:全局异常处理类@ExceptionHandler:指定捕获的异常类型
4)员工信息统计(后端只提供数据给图表)
前端用 ECharts,后端负责返回结构化数据即可。
4.1 职位统计
GET /report/empJobData- 返回
JobOption(jobList, dataList)
SQL 特点:
case job when 1 then '班主任' ... end poscount(*) totalgroup by job
Service 里把 List<Map> 拆成两个 list 返回即可。
4.2 性别统计
GET /report/empGenderData- 返回
List<Map>(形如:[{name:'男', value:xx}, {name:'女', value:xx}])
SQL 特点:
if(gender=1,'男','女') as namecount(*) as valuegroup by gender
4 个练习目标(按顺序)
- 删除:勾选多个员工能删,并且 emp/emp_expr 都干净(事务有效)
- 回显:GET /emps/{id} 返回 emp + exprList 正确封装(resultMap 搞定)
- 修改:PUT 更新后,经历列表能正确“删旧增新”
- 异常:手机号重复时,前端收到统一
Result.error(...)而不是 500