删除单条员工数据可视为特殊的批量删除,开发一个接口即可满足删除员工的功能需求,该接口需实现根据 ID 删除单个员工信息以及根据 ID 批量删除员工信息。
@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
注解用于将请求参数绑定到方法参数上。
EmpServiceImpl
类中,使用@Transactional
注解保证事务一致性,代码如下:@Transactional
public void deleteByIds(List ids) {
//1. 根据ID删除员工基本信息
empMapper.deleteByIds(ids);
//2. 根据ID删除员工的工作经历信息
empExprMapper.deleteByEmpIds(ids);
}
该方法先调用empMapper
的deleteByIds
方法删除员工基本信息,再调用empExprMapper
的deleteByEmpIds
方法删除员工的工作经历信息。
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
条件。
修改员工功能包括查询回显和修改员工信息两个部分。查询回显需要获取员工的基本信息和工作经历信息,修改员工则要更新员工的各项信息。
EmpController
类中,代码如下:@GetMapping("/{id}")
public Result getInfo(@PathVariable Integer id){
log.info("根据id查询员工信息, id: {}", id);
Emp emp = empService.getInfo(id);
return Result.success(emp);
}
@PathVariable
注解用于获取路径中的参数。
mapper
查询员工详细信息。EmpMapper.xml
中,自定义结果集ResultMap
用于封装复杂的查询结果,代码如下:
根据 ID 查询员工详细信息的 SQL 语句为:
EmpController
类中,代码如下:@PutMapping
public Result update(@RequestBody Emp emp){
log.info("修改员工信息, {}", emp);
empService.update(emp);
return Result.success();
}
@RequestBody
注解用于接收请求体中的 JSON 数据,并将其转换为Emp
对象。
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);
}
}
该方法先更新员工基本信息,再删除旧的工作经历信息,最后插入新的工作经历信息。
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
类型的异常。
ReportController
类中,代码如下:@GetMapping("/empJobData")
public Result getEmpJobData(){
log.info("统计各个职位的员工人数");
JobOption jobOption = reportService.getEmpJobData();
return Result.success(jobOption);
}
ReportServiceImpl
类中,代码如下:public JobOption getEmpJobData() {
List
这里的JobOption
是自定义的包含职位列表和人数列表的类。
3. Mapper 层:在ReportMapper.xml
中,统计职位数据的 SQL 语句如下:
这里使用了CASE
流程控制函数,根据job
的值返回对应的职位名称。
ReportController
类中,代码如下:@GetMapping("/empGenderData")
public Result getEmpGenderData(){
log.info("统计员工性别信息");
List
ReportServiceImpl
类中,代码如下:@Override
public List
ReportMapper.xml
中,统计性别信息的 SQL 语句如下:
这里使用了IF
流程控制函数,根据gender
的值返回对应的性别名称。
通过以上对 Tlias 系统员工管理模块的开发介绍,我们详细了解了 Web 后端开发中常见功能的实现方式,包括数据库操作、异常处理以及数据统计等,希望读者能从中获取灵感,应用到自己的项目开发中。