Day10 后端Web实战:员工管理3(删除.修改.统计)
需求

目录
- 删除员工
- 修改员工
- 异常处理
- 员工信息统计
1. 删除员工
1.1 需求分析

- 其实,删除单条数据也是一种特殊的批量删除,所以,删除员工的功能,我们只需要开发一个接口就可以了。
1.2 删除员工--分层分析

-- 删除员工基本信息及其工作经历信息
delete from emp where id in(1,2,3);
delete from emp_expr where emp_id in (1,2,3);

1.3 删除员工--实现
删除员工-Controller接收请求参数 cn/zjy/controller/EmpController.java 添加下列方法
- 方式一:在Controller方法中通过数组来接收
@DeleteMapping
public Result delete(Integer[] ids){
log.info("根据id批量删除员工:{} ", ids);
// empService.deleteByIds(ids);
return Result.success();
}
- 方式二:在Controller方法中通过集合来接收
@DeleteMapping
public Result delete(@RequestParam List<Integer> ids){
log.info("根据id批量删除员工:{} ", ids);
// empService.deleteByIds(ids);
return Result.success();
}

删除员工-Service&Mapper
cn/zjy/service/impl/EmpServiceImpl.java 添加下列方法
@Transactional(rollbackFor = {Exception.class})
public void deleteByIds(List<Integer> ids) {
//1. 根据ID删除员工基本信息
empMapper.deleteByIds(ids);
//2. 根据ID删除员工的工作经历信息
empExprMapper.deleteByEmpIds(ids);
}
cn/zjy/mapper/EmpMapper.java 添加下列方法
void deleteByIds(List<Integer> ids);
cn/zjy/mapper/EmpExprMapper.java 添加下列方法
void deleteByEmpIds(List<Integer> empIds);
src/main/resources/cn/zjy/mapper/EmpMapper.xml 添加下列代码
<!-- 根据ID批量删除员工信息 -->
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
src/main/resources/cn/zjy/mapper/EmpExprMapper.xml 添加下列代码
<!--根据员工ID批量删除员工工作经历信息-->
<delete id="deleteByEmpIds">
delete from emp_expr where emp_id in
<foreach collection="empIds" item="empId" separator="," open="(" close=")">
#{empId}
</foreach>
</delete>


小结

2. 修改员工
需求

2.1 查询回显
查询回显--分层分析

select e.*, ee.id ee_id, ee.company ee_company, ee.job ee_job, ee.begin ee_begin, ee.end ee_end, ee.emp_id ee_empid
from emp e left join emp_expr ee on e.id =ee.emp_id where e.id = 63;
resultMap

cn/zjy/controller/EmpController.java 添加下列方法
/**
*根据ID查询员工信息
*/
@GetMapping("/{id}")
public Result getInfo(@PathVariable Integer id) {
log.info("根据ID查询员工信息:{}",id);
Emp emp = empService.getInfo(id);
return Result.success(emp);
}
cn/zjy/service/EmpService.java 添加下列方法
Emp getInfo(Integer id);
cn/zjy/service/impl/EmpServiceImpl.java 添加下列方法
@Override
public Emp getInfo(Integer id) {
return empMapper.getById(id);
}
cn/zjy/mapper/EmpMapper.java 添加下列方法
Emp getById(Integer id);
src/main/resources/cn/zjy/mapper/EmpMapper.xml 添加getById
<!--根据ID查询员工基本信息及员工的工作经历信息-->
<select id="getById" resultMap="empResultMap" ><!--resultType="cn.zjy.pojo.Emp"-->
select
e.*,
ee.id ee_id,
ee.emp_id ee_empid,
ee.begin ee_begin,
ee.end ee_end,
ee.company ee_company,
ee.job ee_job
from emp e left join emp_expr ee on e.id = ee.emp_id
where e.id= #{id}
</select>
<!--自定义结果集ResultMap-->
<resultMap id="empResultMap" type="cn.zjy.pojo.Emp">
<id column="id" property="id" />
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="salary" property="salary" />
<result column="phone" property="phone" />
<result column="job" property="job" />
<result column="name" property="name" />
<result column="gender" property="gender" />
<result column="image" property="image" />
<result column="entry_date" property="entryDate" />
<result column="dept_id" property="deptId" />
<result column="create_time" property="createTime" />
<result column="update_time" property="updateTime" />
<!--封装exprList-->
<collection property="exprList" ofType="cn.zjy.pojo.EmpExpr">
<id column="ee_id" property="id"/>
<result column="ee_company" property="company"/>
<result column="ee_job" property="job"/>
<result column="ee_begin" property="begin"/>
<result column="ee_end" property="end"/>
<result column="ee_empid" property="empId"/>
</collection>
</resultMap>



2.2 修改数据
需求分析

修改员工--实现
cn/zjy/controller/EmpController.java 添加下列方法
/**
*修改员工
*/
@PutMapping
public Result update(@RequestBody Emp emp) {
log.info("修改员工:{}", emp);
empService.update(emp);
return Result.success();
}
cn/zjy/service/EmpService.java 添加下列方法
void update(Emp emp);
cn/zjy/service/impl/EmpServiceImpl.java 添加下列方法
@Transactional(rollbackFor = {Exception.class})
public void update(Emp emp) {
//1,根据ID修改员工的基本信息
emp.setUpdateTime(LocalDateTime.now());
empMapper.updateById(emp);
//2,根据ID修改员工的工作经历信息
//2.1先根据员工ID删除原有的工作经历
empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
//2.2再添加这个员工新的工作经历
List<EmpExpr> exprList = emp.getExprList();
if (!CollectionUtils.isEmpty(exprList))
exprList.forEach(empExpr -> empExpr.setEmpId(emp.getId()));
empExprMapper.insertBatch(exprList);
}
cn/zjy/mapper/EmpMapper.java 添加下列方法
void updateById(Emp emp);
src/main/resources/cn/zjy/mapper/EmpMapper.xml 添加下列方法
<!-- 根据ID更新员工基本信息-->
<update id="updateById">
UPDATE emp
SET
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}
</update>
-- 根据ID更新员工基本信息
UPDATE emp
SET
username = 'zhangsan',
password ='654321',
name='张三',
gender =1,
phone ='13800138000',
job =2,
salary =8000,
image='/path/to/new/image.jpg',
entry_date='2023-01-01',
dept_id=2,
update_time = Now()
WHERE id =5;


修改员工一程序优化
src/main/resources/cn/zjy/mapper/EmpMapper.xml 修改updateById
<!-- 根据ID更新员工基本信息-->
<!-- set标签:会自动生成set关键字;会自动的删除掉更新字段后多余,-->
<update id="updateById">
<!-- UPDATE emp
SET
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}-->
UPDATE emp
<set>
<if test="username !=null and username !=''">username = #{username},</if>
<if test="password != null and password !=''">password=#{password},</if>
<if test="name != null and name != ''">name = #{name},</if>
<if test="gender != null">gender =#{gender},</if>
<if test="phone !=null and phone != ''">phone =#{phone},</if>
<if test="job!=null">job =#{job},</if>
<if test="salary!= null">salary = #{salary},</if>
<if test="image!= null and image !=''">image =#{image},</if>
<if test="entryDate !=null">entry_date =#{entryDate},</if>
<if test="deptId != null">dept_id = #{deptId},</if>
<if test="updateTime != null">update_time =#{updateTime}</if>
</set>
WHERE id=#{id}
</update>


小结

3.异常处理
问题提出

全局异常处理
- 现在项目中各层出现的异常,是如何处理? 未做处理

- 全局异常处理器


全局异常处理小结

4.员工信息统计
需求

4.1 职位统计
https://echarts.apache.org/zh/index.html

-- 统计每一种职位对应的人数
-- case函数:case 表达式 when val1 then result1 when val2 then result2....else...end
-- 仅用于等值判断
select
(case job
when 1 then '班主任'
when 2 then '讲师'
when 3 then '学工主管'
when 4 then '教研主管'
when 5 then '咨询师'
else '其他' end) pos,
count(*) num
from emp group by job order by num;
-- case函数:case when 条件表达式1 then result1 when 条件表达式2 then result2....else...end
-- 仅用于逻辑判断
select
(case
when job=1 then'班主任'
when job=2 then'讲师'
when job=3 then'学工主管'
when job=4 then'教研主管'
when job=5 then'咨询师'
else '其他' end) pos,
count(*) num
from emp group by job order by num;

cn/zjy/controller/ReportController.java
package cn.zjy.controller;
import cn.zjy.pojo.JobOption;
import cn.zjy.pojo.Result;
import cn.zjy.service.ReportService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RequestMapping("/report")
@RestController
public class ReportController{
@Autowired
private ReportService reportService;
/**
*统计员工职位人数
*/
@GetMapping("/empJobData")
public Result getEmpJobData() {
log.info("统计员工职位人数");
JobOption jobOption = reportService.getEmpJobData();
return Result.success(jobOption);
}
}
cn/zjy/service/ReportService.java
public interface ReportService{
JobOption getEmpJobData() ;
}
cn/zjy/service/impl/ReportServiceImpl.java
@Service
public class ReportServiceImpl implements ReportService {
@Autowired
EmpMapper empMapper;
public JobOption getEmpJobData() {
List<Map<String,Object>> list = empMapper.countEmpJobData();
List<Object> jobList = list.stream().map(dataMap -> dataMap.get("pos")).toList();
List<Object> dataList = list.stream().map(dataMap -> dataMap.get("num")).toList();
return new JobOption(jobList, dataList);
}
}
cn/zjy/mapper/EmpMapper.java 添加下列方法
/**
* 统计员工职位人数
*/
@MapKey("pos")
List <Map<String,Object>> countEmpJobData();
src/main/resources/cn/zjy/mapper/EmpMapper.xml 添加下列方法
<!-- 统计员工职位人数 -->
<select id="countEmpJobData" resultType="java.util.Map">
select
(case job
when 1 then '班主任'
when 2 then '讲师'
when 3 then '学工主管'
when 4 then '教研主管'
when 5 then '咨询师'
else '其他' end) pos,
count(*) num
from emp group by job order by num
</select>


职位统计小结


4.2 性别统计

-- 统计员工性别人数
-- if(条件,true_value,false_value)
select
if(gender=1,'男性员工','女性员工') name,
count(*) value
from emp group by gender;
cn/zjy/controller/ReportController.java
/**
*统计员工性别人数
*/
@GetMapping("/empGenderData")
public Result getEmpGenderData(){
log.info("统计员工性别人数");
List<Map<String,Object>> genderList=reportService.getEmpGenderData();
return Result.success(genderList);
}
cn/zjy/service/ReportService.java
List<Map<String,Object>> countEmpGenderData();
cn/zjy/service/impl/ReportServiceImpl.java 添加下列方法
@Override
public List<Map> getEmpGenderData() {
return empMapper.countEmpGenderData();
}
src/main/resources/cn/zjy/mapper/EmpMapper.xml 添加下列方法
<!-- 统计员工的性别信息 -->
<select id="countEmpGenderData" resultType="java.util.Map">
select
if(gender=1,'男性员工','女性员工') name,
count(*) value
from emp group by gender;
</select>
性别统计验证


性别统计小结


①②③④⑤⑥⑦⑧⑨⑩