【JavaWeb学习Day19】

Tlias智能学习系统(员工管理)

删除员工:

需求分析:

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

三层架构:

Controller:1.接收请求参数(ID值)2.调用Service方法3.响应结果

具体实现:

方式一:

在Controller方法中通过数组来接收

java 复制代码
/**
 * 删除员工 - 数组
 */
@DeleteMapping
public Result delete(Integer[] ids){
    log.info("删除员工:{}", Arrays.toString(ids));
    return Result.success();
}

方式二:

在Controller方法中通过集合来接收

java 复制代码
/**
 * 删除员工 - 集合
 */
@DeleteMapping
public Result delete(@RequestParam List<Integer> ids){
    log.info("删除员工:{}", ids);
    return Result.success();
}

Service:1.批量删除员工基本信息2.批量删除员工的工作经历信息

java 复制代码
/**
 * 删除员工
 * @param ids
 */
@Transactional(rollbackFor = {Exception.class})
@Override
public void delete(List<Integer> ids) {
    //1.批量删除员工信息
    empMapper.deleteByIds(ids);
​
    //2.批量删除员工工作经历信息
    empExprMapper.deleteByEmpIds(ids);
​
}

SQL:

sql 复制代码
-- 删除员工
delete from emp where id in (1,2,3);
delete from emp_expr where emp_id in (1,2,3);
/**
 *根据员工ID删除员工基本信息
 */
void deleteByIds(List<Integer> ids);
<delete id="deleteByIds">
    delete from emp where id in
    <foreach collection="ids" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</delete>
java 复制代码
/**
 * 根据员工id批量删除员工工作经历
 */
void deleteByEmpIds(List<Integer> empIds);
<delete id="deleteByEmpIds">
    delete from emp_expr where emp_id in
    <foreach collection="empIds" item="empId" separator="," close=")" open="(">
        #{empId}
    </foreach>

修改员工信息:

查询回显:

三层架构:

Controller:1.接收请求参数(ID值)2.调用Service层方法3.响应结果

java 复制代码
/**
 * 根据ID查询员工信息
 */
@GetMapping("/{id}")
public Result getInfo(@PathVariable Integer id){
    log.info("根据ID查询员工信息:{}",id);
    Emp emp = empService.getInfo(id);
    return Result.success(emp);
}

Service:调用Mapper查询员工详细信息(基本信息,工作经历信息)

java 复制代码
    @Override
    public Emp getInfo(Integer id) {
        return  empMapper.getById(id);
    }

Mapper:

sql 复制代码
-- 根据ID查询员工基本信息(emp)以及员工工作经历信息(emp_expr)
-- 外连接
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 tlias.emp_expr ee on e.id = ee.emp_id
where e.id=37;
java 复制代码
/**
 * 根据员工ID查询员工信息
 */
Emp getById(Integer id);
XML 复制代码
<!--自定义结果集ResultMap-->
<resultMap id="empResultMap" type="com.itheima.pojo.Emp">
    <id column="id" property="id" />
    <result column="username" property="username" />
    <result column="password" property="password" />
    <result column="name" property="name" />
    <result column="gender" property="gender" />
    <result column="phone" property="phone" />
    <result column="job" property="job" />
    <result column="salary" property="salary" />
    <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="com.itheima.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>
​
<!--根据ID查询员工的详细信息-->
<select id="getById" resultMap="empResultMap">
    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>

(注意:如果查询返回的字段与实体的属性名可以直接对上,用resultType,对不上,或者实体属性比较复杂,可以通过resultMap手动封装)

修改数据:

三层架构:

Controller:1.接收请求参数2.调用Service方法3.响应结果

java 复制代码
/**
 * 修改员工数据
 */
​
@PutMapping
public Result update(@RequestBody Emp emp){
    log.info("修改员工数据:{}",emp);
    empService.update(emp);
    return Result.success();
}

Service:1.根据ID修改员工的基本信息2.根据ID修改员工工作经历信息(先删再添加)

java 复制代码
/**
 * 修改员工信息
 */
@Override
public void update(Emp emp) {
    //1.根据Id修改员工的基本信息
    emp.setUpdateTime(LocalDateTime.now());
    empMapper.updateById(emp);
    //2.根据ID修改员工的工作经历信息
    //2.1先删除
    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);
    }
}

Mapper:

java 复制代码
/**
 *根据ID更新员工的基本信息
 */
void updateById(Emp emp);
XML 复制代码
    <!--根据ID更新员工信息-->
<!--    set标签:会自动生成set关键字;会自动的删除掉更新字段后多余的,-->
    <update id="updateById">
        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>
异常处理:

全局异常处理器:

java 复制代码
/**
 * 全局异常处理器
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public Result handleException(Exception e){
        log.error("程序出错了",e);
        return Result.error("出错了,请联系管理员");
    }
​
    @ExceptionHandler
    public Result handleDuplicateKeyException(DuplicateKeyException e){
        log.error("程序出错了",e);
        String message = e.getMessage();
        int i = message.indexOf("Duplicate entry");
        String errMsg = message.substring(i);
        String[] arr =  errMsg.split(" ");
        return Result.error(arr[2]+ "已存在");
    }
}
员工信息统计:
职位统计:

三层架构:

Controller:1.接收请求2.调用Service方法3.响应结果

java 复制代码
/**
 * 统计员工职位人数
 */
@GetMapping("/empJobData")
public Result getEmpJobDate(){
​
    log.info("统计员工职位人数");
    JobOption jobOption=  reportService.getEmpJobDate();
    return Result.success(jobOption);
}

Service:1.调用mapper方法获取职位统计数据2.解析封装统计结果(JobOption)

复制代码
  
java 复制代码
  @Override
    public JobOption getEmpJobDate() {
​
        //1.调用mapper接口,获取统计数据
        List<Map<String,Object>> list = empMapper.countEmpJobData();//map:pos = 教研主管,num = 1
        //2.组装结果,并返回
        List<Object> jobList = list.stream().map(dataMap->dataMap.get("pos")).toList();
        List<Object> numList = list.stream().map(dataMap->dataMap.get("num")).toList();
​
        return new JobOption(jobList,numList);
    }

Mapper:

sql 复制代码
-- 统计每一种职位对应的人数
-- 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;
java 复制代码
/**
 * 统计员工职位人数
 */
List<Map<String, Object>> countEmpJobData();
XML 复制代码
<!--    统计员工职位人数-->
    <select id="countEmpJobData" resultType="java.util.Map">
        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;
    </select>
</mapper>
性别统计:

三层架构:

Controller:1.接收请求2.调用Service方法3.响应结果

java 复制代码
    /**
     * 统计员工性别人数
     */
    @GetMapping("/empGenderData")
    public Result getEmpGenderData(){
        log.info("统计员工性别人数");
        List<Map<String,Object>> genderList =  reportService.getEmpGenderData();
        return Result.success(genderList);
    }

Service:1.调用mapper方法获取职位统计数据2.解析封装统计结果(JobOption)

java 复制代码
    @Override
    public List<Map<String, Object>> getEmpGenderData() {
        return empMapper.countEmpGenderDate();
    }

Mapper:

sql 复制代码
-- 统计员工性别人数
-- if(条件,true_value,false_value)
-- ifnull(expr,val1):如果expr不为null,取自身,否则取val1
select
    if(gender = 1,'男性员工','女性员工') name,
    count(*) value
from emp group by gender ;
java 复制代码
/**
 * 统计员工性别人数
 */
List<Map<String, Object>> countEmpGenderDate();
XML 复制代码
<select id="countEmpGenderDate" resultType="java.util.Map">
    select
        (case when gender = 1 then'男性员工'when gender = 2 then '女性员工' end) name,
        count(*) value
    from emp group by gender ;
</select>
相关推荐
m0_466923802 分钟前
【java】类声明的两种形式
java
yngsqq18 分钟前
NTS库学习,找bug中......
java·学习·bug
所得皆惊喜22 分钟前
SPRING10_SPRING的生命周期流程图
java·spring·流程图
m0_7482299926 分钟前
Java 进阶面试指南
java·测试工具·面试
zzyh1234561 小时前
springcloud负载均衡策略有哪些
java·spring cloud·负载均衡
AlexMercer10121 小时前
Java 入门第一课 InteliJ IDEA 的快捷操作
android·java·开发语言·ide·笔记·intellij-idea
%d%d21 小时前
找不到依赖项 <…> (Maven)
java·ide·intellij-idea
无际单片机编程2 小时前
单片机延时函数怎么写规范?
java·c语言·stm32·单片机·嵌入式硬件
念言-ny2 小时前
sentinel小记
java·spring boot·sentinel
Hamm2 小时前
封装一个优雅的自定义的字典验证器,让API字典参数验证更湿滑
java·spring boot·后端