- 发布日期
员工统计: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>
每行返回 pos 和 num,因此 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>。