day04--后端10-后端Web实战(员工管理)

32 阅读2分钟

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

核心策略(讲义用的是“先删再增”)

  1. update emp(更新基本信息,补 updateTime
  2. delete emp_expr where emp_id = ?(删除旧经历)
  3. 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 pos
  • count(*) total
  • group by job

Service 里把 List<Map> 拆成两个 list 返回即可。

4.2 性别统计

  • GET /report/empGenderData
  • 返回 List<Map>(形如:[{name:'男', value:xx}, {name:'女', value:xx}]

SQL 特点:

  • if(gender=1,'男','女') as name
  • count(*) as value
  • group by gender

4 个练习目标(按顺序)

  1. 删除:勾选多个员工能删,并且 emp/emp_expr 都干净(事务有效)
  2. 回显:GET /emps/{id} 返回 emp + exprList 正确封装(resultMap 搞定)
  3. 修改:PUT 更新后,经历列表能正确“删旧增新”
  4. 异常:手机号重复时,前端收到统一 Result.error(...) 而不是 500