【JavaWeb学习Day19】

embedded/2025/3/1 0:03:05/

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/embedded/168913.html

相关文章

盛京开源社区加入 GitCode,书写东北开源生态新篇章

在数字化转型与开源技术蓬勃发展的浪潮下&#xff0c;开源社区已成为推动技术创新的核心力量。盛京开源社区&#xff08;SJOSC&#xff09;作为沈阳地区的开源交流平台&#xff0c;始终致力于连接开发者、企业及高校&#xff0c;构建区域技术生态圈。 现在&#xff0c;盛京开源…

Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决

前言 在将 Spring Boot 项目升级至 3.3.4 版本后&#xff0c;遇到 Logback 配置的兼容性问题。本文将详细描述该问题的错误信息、原因分析&#xff0c;并提供调整日志回滚策略的解决方案。 错误描述 这是SpringBoot 3.3.3版本之前的回滚策略的配置 <!-- 日志记录器的滚动…

算法-数据结构(图)-迪杰斯特拉最短逻辑算法( Dijkstra)

迪杰斯特拉算法&#xff08;Dijkstras Algorithm&#xff09; 是一种用于计算单源最短路径的经典算法&#xff0c;由荷兰计算机科学家 艾兹赫尔迪杰斯特拉&#xff08;Edsger W. Dijkstra&#xff09; 于1956年提出。它的主要目标是找到从图中的某个源节点到所有其他节点的最短…

深圳南柯电子|医疗设备EMC测试整改检测:零到一,保障医疗安全

在当今医疗科技飞速发展的时代&#xff0c;医疗设备的电磁兼容性&#xff08;EMC&#xff09;已成为确保其安全、有效运行的关键要素之一。EMC测试整改检测不仅关乎设备的性能稳定性&#xff0c;更是保障患者安全、避免电磁干扰引发医疗事故的重要措施。 一、医疗设备EMC测试整…

Linux | YUM / RPM 常用命令

YUM 与 RPM 常用命令使用指南 YUM 基于 RPM&#xff0c;用于在线管理软件包&#xff0c;能自动解决依赖问题&#xff0c;方便日常使用&#xff1b;RPM 则用于本地软件包管理&#xff0c;需手动处理依赖&#xff0c;适用于特殊场景。使用rpm命令安装/升级软件包时&#xff0c;-…

【UML】统一建模语言 UML 基础

【UML】统一建模语言UML 基础 文章目录 一、概述1.1 - 什么是建模1.2 建模的原则1.3 软件建模的实现过程 二、 UML2.1 UML中10种图 三、用例图3.1 用例之间的关系 —— 泛化关系3.2 用例之间的关系 —— 包含关系3.3 用例之间的关系 —— 扩展关系 四、类图4.1 类的表示方法4.2…

Web安全|渗透测试|网络安全

基础入门(P1-P5) p1概念名词 1.1域名 什么是域名&#xff1f; 域名&#xff1a;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 什么是二级域名多级域名…

ES01 - ES基础入门

ElasticSearch基础入门 文章目录 ElasticSearch基础入门一&#xff1a;什么是ElasticSearch1&#xff1a;ELK Stack2&#xff1a;全文搜索引擎3&#xff1a;ES or Sola 二&#xff1a;ES下载安装1&#xff1a;windows安装操作1.1&#xff1a;下载对应的压缩包1.2&#xff1a;全…