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


需求

图1 删除.修改.异常.统计需求
目录

1. 删除员工

1.1 需求分析

图2 删除需求分析

1.2 删除员工--分层分析

图3 删除员工--接口要求
-- 删除员工基本信息及其工作经历信息
delete from emp where id in(1,2,3);
delete from emp_expr where emp_id in (1,2,3);
图4 删除员工--分层功能

1.3 删除员工--实现

删除员工-Controller接收请求参数 cn/zjy/controller/EmpController.java 添加下列方法
@DeleteMapping
public Result delete(Integer[] ids){
    log.info("根据id批量删除员工:{} ", ids);
    // empService.deleteByIds(ids);
    return Result.success();
}
@DeleteMapping
public Result delete(@RequestParam List<Integer> ids){
    log.info("根据id批量删除员工:{} ", ids);
    // empService.deleteByIds(ids);
    return Result.success();
}
图5 删除员工--接受请求参数
删除员工-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>
图6 员工删除测试验证1
图7 员工删除测试验证2

小结

图8 删除员工小结

2. 修改员工

需求

图9 修改员工需求

2.1 查询回显

查询回显--分层分析
图10 查询回显--分层分析
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

图11 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>
图12 查询回显验证1
图13 查询回显验证2
图14 resultType和resultMap小结

2.2 修改数据

需求分析

图15 修改员工需求

修改员工--实现

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;
图16 修改员工测试验证1
图17 修改员工测试验证2

修改员工一程序优化

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>
图18 修改员工一程序优化验证1
图19 修改员工一程序优化验证2
小结
图20 修改员工一程序优化小结

3.异常处理

问题提出

图21 问题提出

全局异常处理

图22 出现的异常未做处理的输出和利用Try-Catch处理的繁琐
图23 全局异常处理
图24 全局异常处理验证

全局异常处理小结

图25 全局异常处理小结小结

4.员工信息统计

需求

图26 员工信息统计需求

4.1 职位统计

https://echarts.apache.org/zh/index.html

图27 职位统计
-- 统计每一种职位对应的人数
-- 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;
图28 职位统计分层功能
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>
图29 职位统计验证1
图30 职位统计验证2

职位统计小结

图31 职位统计
图32 职位统计小结

4.2 性别统计

图33 性别统计
-- 统计员工性别人数
-- 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>

性别统计验证

图34 性别统计验证1
图35 性别统计验证2

性别统计小结

图36 性别统计
图37 小结

①②③④⑤⑥⑦⑧⑨⑩


返回