员工管理(3)-删除员工-修改员工-全局异常处理器-员工信息统计

目录

员工管理:

删除员工:

Controller层:

Service层:

Mapper接口:

接受参数的两种方式:

修改员工:

查询回显:

Controller层:

Service层:

Mapper接口:

修改数据:

Controller层:

Service层:

Mapper接口:

程序优化:

员工信息统计:

职位统计开发

Controller层:

Service层:

Mapper接口:

性别统计:


员工管理:

删除员工:

明确三层架构职责:

Controller层:


1.接受参数(ID值)

2.调用Service层

3.响应结果

Service层:

1.调用Mapper接口方法,批量删除员工基本信息

2.调用Mapper接口方法,批量删除员工的工作经历信息

Mapper接口:

执行SQL语句

接受参数的两种方式:

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

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

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

public Result delete(@RequestParam List<Integer> ids){
  log.info("根据id批量删除员工:{}",ids);
  return Result。success();
}

Service层:

@Transactional(rollbackFor = {Exception.class})
public void deleteByIds(List<Integer> ids){
  //1.根据ID删除员工基本信息
  empMapper.deleteByIds(ids);
  //2.根据ID删除员工的工作经历
  empExprMapper.deleteByEmpIds(ids);
}

Mapper层xml:

//根据ID批量删除员工信息
<delete id="deleteByIds">
  delete from emp where id in
  <foreach collection="ids" item="id" separator="," open="(" close=")">
    #{id}
  </foreach> 
</delete>

//根据员工ID批量删除员工工作经历信息
<delete id="deleteByEmpIds">
  delete from emp_expr where emp_id in
  <foreach collection="empIds" item="empId" separator="," open="(" close=")"
    #{empId}
  </foreach>
</delete>

修改员工:

查询回显:

明确三层架构职责:

Controller层:


1.接受参数(ID值)

2.调用Service层

3.响应结果

Service层:

1.调用Mapper接口方法,查询员工详细信息

Mapper接口:

执行SQL语句

方法实现:

Controller层:

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

Service层:

@Override
public Emp getInfo(Integer id){
  return empMapper.getById(id);
}

Mapper层:

//根据ID查询员工基本信息及员工的工作经历信息
<select id="empResultMap" resultType="包名">
  select e.*,ee.id ee_id,ee.emp_id ee_empid,ee.begin ee_end,ee.end ee_end,ee.companyee_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="包名"/>
  <id column="id" property="id"/>
  <result cloumn="username" property="username"/>
  <result cloumn="password" property="password"/>
  <result cloumn="name" property="name"/>
  <result cloumn="gender" property="gender"/>
  <result cloumn="phone" property="phone"/>
  <result cloumn="job" property="job"/>
  <result cloumn="salary" property="salary"/>
  <result cloumn="image" property="image"/>
  <result cloumn="entry_date" property="entry_date"/>
  <result cloumn="dept_id" property="dept_id"/>
  <result cloumn="create_time" property="create_time"/>
  <result cloumn="update_time" property="update_time"/>

//封装工作经历信息
  <collection property="exprList" ofType="包名">
    <id cloumn="ee_id" property="id"/>
    <result cloumn="ee.empid" property="ee.empid"/>
    <result cloumn="ee_begin" property="ee_begin"/>
    <result cloumn="ee_end" property="ee_end"/>
    <result cloumn="ee_company" property="ee_company"/>
    <result cloumn="ee_job" property="ee_job"/>
  </collection>
</resultMap>
    
  

因为实体类里面有对象也有属性所以需要resultMap手动封装

如果查询返回的字段名与实体的属性名可以直接对应上,用resultType

如果查询返回的字段名和实体的属性名对应不上,或实体属性比较复杂,也可以通过resultMap手动封装

修改数据:

明确三层架构职责:

Controller层:


1.接受参数

2.调用Service层

3.响应结果

Service层:

1.根据ID修改员工的基本信息

2.根据ID修改工作经历信息(先删除再添加)

Mapper接口:

执行SQL语句

方法实现:

Controller层:

@PutMapping
public Result update(@RequestBody Emp emp){
  log.info("修改员工:{}",emp);
  empService.update(emp);
  return Result.success();
}

Service层:

@Override
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);
}
}

Mapper层:

//根据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>

程序优化:

使用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="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>

全局异常处理器:

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

@RestControllerAdvice = @ControllerAdvice + @ResponseBody

员工信息统计:

case函数:

case when 条件表达式1 then result1 when 条件表达式2 then result2 ... else ... end

职位统计开发

明确三层架构职责:

Controller层:


1.接受参数

2.调用Service层

3.响应结果

Service层:

1.调用mapper方法获取职位统计数据

2.解析数据封装统计结果(JobOption)

Mapper接口:

执行SQL语句

Controller层:

@GetMapping("/empJobDate")
public Result getEmpJobDate(){
  log.info("统计各个职位的员工人数");
  JobOption jobOption = reportService.getEmpJobData();
  return Reult.success(jobOption);
}

Service层:

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);
}

Mapper层:

<select id="countEmpJobData" resultType="包名">
  select
    (case when job =1 then '班主任'
     when job =2 then '讲师'
     when job =3 then '学工主管'
     when job =4 then '教研主管'
     when job =5 then '咨询师'
     else '其他'end) as pos,
  from emp
  group by job order by num
  </select>

性别统计:

Controller层:

@GetMapping("/empGenderData")
public Result getEmpGenderData(){
  log.info("统计员工信息");
  List<Map> genderList = reportService.getEmpGenderData();
  return Result.success(genderList);
}

Service层:

@Override
public List<Map> getEmpGenderData(){
  return empMapper.countEmpGenderData();
}

Mapper层:

//统计员工的性别信息
<select id="countEmpGenderData" resultType="包名"
  select
    if(gender = 1,'男','女') name,
    count(*) value
  from emp group by gender;
</select>

if流程控制函数:

if(expr,val1,val2):如果表达式expr成立,取val1,否则取val2

ifnull(expr,val):如果expr不为null,取自身,否则取val1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值