【JavaWeb学习Day19】

devtools/2025/2/28 16:15:49/

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:

-- 删除员工
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">    @Overridepublic Emp getInfo(Integer id) {return  empMapper.getById(id);}

Mapper:

-- 根据ID查询员工基本信息(emp)以及员工工作经历信息(emp_expr)
-- 外连接
selecte.*,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);
<!--自定义结果集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_jobfrom emp e left join emp_expr ee on e.id = ee.emp_idwhere 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);
    <!--根据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 {@ExceptionHandlerpublic Result handleException(Exception e){log.error("程序出错了",e);return Result.error("出错了,请联系管理员");}
​@ExceptionHandlerpublic 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">  @Overridepublic 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:

-- 统计每一种职位对应的人数
-- 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();
<!--    统计员工职位人数--><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">    @Overridepublic List<Map<String, Object>> getEmpGenderData() {return empMapper.countEmpGenderDate();}

Mapper:

-- 统计员工性别人数
-- if(条件,true_value,false_value)
-- ifnull(expr,val1):如果expr不为null,取自身,否则取val1
selectif(gender = 1,'男性员工','女性员工') name,count(*) value
from emp group by gender ;
java">/*** 统计员工性别人数*/
List<Map<String, Object>> countEmpGenderDate();
<select id="countEmpGenderDate" resultType="java.util.Map">select(case when gender = 1 then'男性员工'when gender = 2 then '女性员工' end) name,count(*) valuefrom emp group by gender ;
</select>


http://www.ppmy.cn/devtools/163390.html

相关文章

2024年第十五届蓝桥杯大赛软件赛省赛Python大学A组真题解析

文章目录 试题A: 拼正方形(本题总分:5 分)解析答案试题B: 召唤数学精灵(本题总分:5 分)解析答案试题C: 数字诗意解析答案试题A: 拼正方形(本题总分:5 分) 【问题描述】 小蓝正在玩拼图游戏,他有7385137888721 个2 2 的方块和10470245 个1 1 的方块,他需要从中挑出一些…

深度学习-6.用于计算机视觉的深度学习

Deep Learning - Lecture 6 Deep Learning for Computer Vision 简介深度学习在计算机视觉领域的发展时间线 语义分割语义分割系统的类型上采样层语义分割的 SegNet 架构软件中的SegNet 架构数据标注 目标检测与识别目标检测与识别问题两阶段和一阶段目标检测与识别两阶段检测器…

实现实时数据仓库开源项目

根据你的需求&#xff0c;以下是一些可以实现类似 ClickHouse 的实时数仓功能的项目&#xff0c;这些项目提供了高性能的数据处理和分析能力&#xff0c;适合实时数据仓库的场景&#xff1a; 1. Apache Doris Apache Doris 是一个开源的实时数据仓库&#xff0c;支持高吞吐量…

HTTPS 与 HTTP 的区别在哪?

HTTP与HTTPS作为互联网数据传输的核心协议&#xff0c;其通信机制与安全特性深刻影响着现代网络应用的可靠性与用户体验。本文将解析两者的通信流程、安全机制及核心差异。 一、HTTP的通信机制 先来看看HTTP是什么吧。 HTTP基于TCP/IP协议栈&#xff0c;采用经典客户端-服务…

蓝桥杯之日期题

文章目录 1.蓝桥杯必备知识点2. 题型13.需求2 1.蓝桥杯必备知识点 蓝桥杯是一个面向全国高校计算机相关专业学生的学科竞赛&#xff0c;涵盖多个赛道&#xff0c;常见的有软件类&#xff08;如 C/C 程序设计、Java 软件开发、Python 程序设计&#xff09;和电子类&#xff08;…

【嵌入式Linux应用开发基础】网络编程(4):UDP协议

目录 一、UDP 协议概述 二、UDP 协议特点 三、UDP协议的字段格式 四、UDP协议的数据传输过程 五、嵌入式UDP编程核心API 六、UDP 在嵌入式 Linux 中的编程实现 6.1 UDP 服务器代码示例 6.2 UDP 客户端代码示例 七、UDP 协议的应用场景 八、UDP 协议的优缺点 8.1 优点…

不能初始化photoshop,因为暂存盘已满

问题&#xff1a; 当 Photoshop&#xff08;PS&#xff09;启动时提示 “不能初始化&#xff0c;因为暂存盘已满”&#xff0c;通常是由于默认暂存盘&#xff08;一般为 C 盘&#xff09;存储空间不足导致。暂存盘用于临时存放 PS 处理中的缓存文件&#xff0c;若其所在分区空…

自然语言处理入门2——神经网络

一、概述 上一篇文章《自然语言处理入门1——单词的表示和距离》我们谈到了单词的表示以及距离的相似度计算&#xff0c;从而可以预测哪个单词的出现概率最高&#xff0c;这种方法被成为基于计数的方法&#xff0c;因为从根本上都要计算单词的出现次数&#xff0c;构建共现矩阵…