【学习总结|DAY031】后端Web实战(员工管理)三

一、删除员工功能实现

(一)需求分析

删除单条员工数据可视为特殊的批量删除,开发一个接口即可满足删除员工的功能需求,该接口需实现根据 ID 删除单个员工信息以及根据 ID 批量删除员工信息。

(二)代码实现

  1. Controller 层:提供两种接收请求参数的方式。通过集合接收参数的代码如下:
@DeleteMapping
public Result delete(@RequestParam List ids){
    log.info("根据id批量删除员工:{} ", ids);
    return Result.success();
}

通过数组接收参数的代码为:

@DeleteMapping
public Result delete(Integer[] ids){
    log.info("根据id批量删除员工:{} ", ids);
    return Result.success();
}

这里的Result是自定义的响应结果类,用于统一返回数据格式。@RequestParam注解用于将请求参数绑定到方法参数上。

  1. Service 层:在EmpServiceImpl类中,使用@Transactional注解保证事务一致性,代码如下:
@Transactional
public void deleteByIds(List ids) {
    //1. 根据ID删除员工基本信息
    empMapper.deleteByIds(ids);
    //2. 根据ID删除员工的工作经历信息
    empExprMapper.deleteByEmpIds(ids);
}

该方法先调用empMapperdeleteByIds方法删除员工基本信息,再调用empExprMapperdeleteByEmpIds方法删除员工的工作经历信息。

  1. Mapper 层:在EmpMapper.xml中,根据 ID 批量删除员工信息的 SQL 语句如下:

  delete from emp where id in
  
     #{id}
  

EmpExprMapper.xml中,根据员工 ID 批量删除员工工作经历信息的 SQL 语句为:


  delete from emp_expr where emp_id in
  
      #{empId}
  

这里的标签用于遍历集合,构建 SQL 的IN条件。

二、修改员工功能实现

(一)需求分析

修改员工功能包括查询回显和修改员工信息两个部分。查询回显需要获取员工的基本信息和工作经历信息,修改员工则要更新员工的各项信息。

(二)代码实现

  1. 查询回显
    • Controller 层:在EmpController类中,代码如下:
@GetMapping("/{id}")
public Result getInfo(@PathVariable Integer id){
    log.info("根据id查询员工信息, id: {}", id);
    Emp emp = empService.getInfo(id);
    return Result.success(emp);
}

@PathVariable注解用于获取路径中的参数。

  • Service 层:调用mapper查询员工详细信息。
  • Mapper 层:在EmpMapper.xml中,自定义结果集ResultMap用于封装复杂的查询结果,代码如下:

    
    
    
    
    
    
    
    
    
    
    
    
        
        
        
        
        
        
    

根据 ID 查询员工详细信息的 SQL 语句为:


  1. 修改员工
    • Controller 层:在EmpController类中,代码如下:
@PutMapping
public Result update(@RequestBody Emp emp){
    log.info("修改员工信息, {}", emp);
    empService.update(emp);
    return Result.success();
}

@RequestBody注解用于接收请求体中的 JSON 数据,并将其转换为Emp对象。

  • Service 层:在EmpServiceImpl类中,使用@Transactional注解保证事务一致性,代码如下:
@Transactional
public void update(Emp emp) {
    //1. 根据ID更新员工基本信息
    emp.setUpdateTime(LocalDateTime.now());
    empMapper.updateById(emp);
    //2. 根据员工ID删除员工的工作经历信息 【删除老的】
    empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
    //3. 新增员工的工作经历数据 【新增新的】
    Integer empId = emp.getId();
    List exprList = emp.getExprList();
    if(!CollectionUtils.isEmpty(exprList)){
        exprList.forEach(empExpr -> empExpr.setEmpId(empId));
        empExprMapper.insertBatch(exprList);
    }
}

该方法先更新员工基本信息,再删除旧的工作经历信息,最后插入新的工作经历信息。

  • Mapper 层:在EmpMapper.xml中,根据 ID 修改员工基本信息的 SQL 语句如下:

  update emp
  
    username=#{username},
    password #{password},
    name = #{name},
    gender = #{gender},
    phone = #{phone},
    job = #{job},
    salary = #{salary},
    image = #{image},
    entry_date = #{entryDate},
    dept_id = #{deptId},
    update_time = #{updateTime}
  
  where id = #{id}

标签用于动态生成SET子句,避免多余的逗号。

三、异常处理

在项目开发和运行过程中,异常处理至关重要。在 Tlias 系统中,采用全局异常处理器来统一处理异常。

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public Result handleException(Exception e){
        log.error("全局异常处理器, 拦截到异常", e);
        return Result.error("对不起,服务器异常,请稍后重试");
    }
}

@RestControllerAdvice注解相当于@ControllerAdvice@ResponseBody的组合,用于定义全局异常处理器。@ExceptionHandler注解用于指定处理的异常类型,这里处理所有Exception类型的异常。

四、员工信息统计

(一)职位统计

  1. Controller 层:在ReportController类中,代码如下:
@GetMapping("/empJobData")
public Result getEmpJobData(){
    log.info("统计各个职位的员工人数");
    JobOption jobOption = reportService.getEmpJobData();
    return Result.success(jobOption);
}

  1. Service 层:在ReportServiceImpl类中,代码如下:
public JobOption getEmpJobData() {
    List> list = empMapper.countEmpJobData();
    List jobList = list.stream().map(dataMap -> dataMap.get("pos")).toList();
    List dataList = list.stream().map(dataMap -> dataMap.get("num")).toList();
    return new JobOption(jobList, dataList);
}
 
  

这里的JobOption是自定义的包含职位列表和人数列表的类。
3. Mapper 层:在ReportMapper.xml中,统计职位数据的 SQL 语句如下:


这里使用了CASE流程控制函数,根据job的值返回对应的职位名称。

(二)性别统计

  1. Controller 层:在ReportController类中,代码如下:
@GetMapping("/empGenderData")
public Result getEmpGenderData(){
    log.info("统计员工性别信息");
    List genderList = reportService.getEmpGenderData();
    return Result.success(genderList);
}

  1. Service 层:在ReportServiceImpl类中,代码如下:
@Override
public List getEmpGenderData() {
    return empMapper.countEmpGenderData();
}

  1. Mapper 层:在ReportMapper.xml中,统计性别信息的 SQL 语句如下:

这里使用了IF流程控制函数,根据gender的值返回对应的性别名称。

通过以上对 Tlias 系统员工管理模块的开发介绍,我们详细了解了 Web 后端开发中常见功能的实现方式,包括数据库操作、异常处理以及数据统计等,希望读者能从中获取灵感,应用到自己的项目开发中。

你可能感兴趣的:(学习,mysql,java,mybatis)