缘博客
发布日期

员工统计:MyBatis聚合查询与流程控制函数

作者
  • 姓名
    社交账号

员工信息统计

课程中实现了两类员工统计:

职位统计
性别统计

前端分别展示柱状图与环形图,后端负责对数据库进行分组聚合并按前端需要的结构返回。


职位统计

返回结构:

{
  "code": 1,
  "msg": "success",
  "data": {
    "jobList": ["教研主管", "学工主管", "其他", "班主任", "咨询师", "讲师"],
    "dataList": [1, 1, 2, 6, 8, 13]
  }
}

定义:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class JobOption {
    private List jobList;
    private List dataList;
}

职位统计SQL

职位在数据库中使用数字编码,因此先通过 CASE 转换名称,再统计人数:

<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) as pos,
        count(*) as num
    from emp
    group by job
    order by num
</select>

每行返回 posnum,因此 MyBatis 可以封装为 Map


CASE流程控制函数

条件写法:

case
    when cond1 then res1
    when cond2 then res2
    else res
end

等值匹配写法:

case expr
    when val1 then res1
    when val2 then res2
    else res
end

职位统计使用 CASE 把职位编码转换成文字。


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

Controller:

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

性别统计

返回结构:

[
  { "name": "男性员工", "value": 5 },
  { "name": "女性员工", "value": 6 }
]

课程中直接使用 List<Map> 封装。


性别统计SQL

<select id="countEmpGenderData" resultType="java.util.Map">
    select
        if(gender = 1, '男', '女') as name,
        count(*) as value
    from emp
    group by gender
</select>

IF 语法:

if(expr, val1, val2)

表达式成立返回 val1,否则返回 val2

课程还介绍了:

ifnull(expr, val1)

如果 expr 不为 null 返回自身,否则返回 val1


性别统计调用链

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

核心仍然是:

GROUP BY
+
COUNT

职位统计多了一步 Service 数据组装,性别统计则可以直接返回 List<Map>