【JavaWeb学习Day19】

Tlias智能学习系统(员工管理)

删除员工:

需求分析:

其实,删除单条数据也是一种特殊的批量删除,所以,删除员工的功能,我们只需要开发一个接口就行了。

三层架构:

Controller:1.接收请求参数(ID值)2.调用Service方法3.响应结果

具体实现:

方式一:

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

/**
 * 删除员工 - 数组
 */
@DeleteMapping
public Result delete(Integer[] ids){
    log.info("删除员工:{}", Arrays.toString(ids));
    return Result.success();
}

方式二:

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

/**
 * 删除员工 - 集合
 */
@DeleteMapping
public Result delete(@RequestParam List<Integer> ids){
    log.info("删除员工:{}", ids);
    return Result.success();
}

Service:1.批量删除员工基本信息2.批量删除员工的工作经历信息

/**
 * 删除员工
 * @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>
/**
 * 根据员工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.响应结果

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

Service:调用Mapper查询员工详细信息(基本信息,工作经历信息)

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

Mapper:

-- 根据ID查询员工基本信息(emp)以及员工工作经历信息(emp_expr)
-- 外连接
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_job
from emp e left join tlias.emp_expr ee on e.id = ee.emp_id
where e.id=37;
/**
 * 根据员工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_job
    from emp e left join emp_expr ee on e.id = ee.emp_id
    where e.id = #{id}
</select>

(注意:如果查询返回的字段与实体的属性名可以直接对上,用resultType,对不上,或者实体属性比较复杂,可以通过resultMap手动封装)

修改数据:

三层架构:

Controller:1.接收请求参数2.调用Service方法3.响应结果

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

Service:1.根据ID修改员工的基本信息2.根据ID修改员工工作经历信息(先删再添加)

/**
 * 修改员工信息
 */
@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:

/**
 *根据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>
异常处理:

全局异常处理器:

/**
 * 全局异常处理器
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public Result handleException(Exception e){
        log.error("程序出错了",e);
        return Result.error("出错了,请联系管理员");
    }
​
    @ExceptionHandler
    public 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.响应结果

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

Service:1.调用mapper方法获取职位统计数据2.解析封装统计结果(JobOption)

  
  @Override
    public 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;
/**
 * 统计员工职位人数
 */
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.响应结果

    /**
     * 统计员工性别人数
     */
    @GetMapping("/empGenderData")
    public Result getEmpGenderData(){
        log.info("统计员工性别人数");
        List<Map<String,Object>> genderList =  reportService.getEmpGenderData();
        return Result.success(genderList);
    }

Service:1.调用mapper方法获取职位统计数据2.解析封装统计结果(JobOption)

    @Override
    public List<Map<String, Object>> getEmpGenderData() {
        return empMapper.countEmpGenderDate();
    }

Mapper:

-- 统计员工性别人数
-- if(条件,true_value,false_value)
-- ifnull(expr,val1):如果expr不为null,取自身,否则取val1
select
    if(gender = 1,'男性员工','女性员工') name,
    count(*) value
from emp group by gender ;
/**
 * 统计员工性别人数
 */
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(*) value
    from emp group by gender ;
</select>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/977250.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 上源码安装 FastGPT

FastGPT 是一个强大的 AI RAG 平台&#xff0c;值得我们去学习了解。与常见的 Python 体系不同&#xff0c;Fast GPT 采用 Node.js/Next.js 平台&#xff08;对于广大 JS 开发者或前端开发者比较亲切友好&#xff09;&#xff0c;安装或部署比较简单。虽然一般情况下推荐简单的…

FreiHAND (handposeX-json 格式)数据集-release >> DataBall

FreiHAND &#xff08;handposeX-json 格式&#xff09;数据集-release 注意&#xff1a; 1)为了方便使用&#xff0c;按照 handposeX json 自定义格式存储 2)使用常见依赖库进行调用,降低数据集使用难度。 3)部分数据集获取请加入&#xff1a;DataBall-X数据球(free) 4)完…

Sinusoidal、RoPE和可学习嵌入的详细介绍及它们增强位置感知能力的示例

前文,我们已经构建了一个小型的字符级语言模型,是在transformer架构基础上实现的最基本的模型,我们肯定是希望对该模型进行改进和完善的。所以我们的另外一篇文章也从数据预处理、模型架构、训练策略、评估方法、代码结构、错误处理、性能优化等多个方面提出具体的改进点,但…

【JavaEE进阶】Spring Boot配置文件

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 SpringBoot配置⽂件 举例: 通过配置文件修改端口号 配置⽂件的格式 properties基本语法 读取配置⽂件 properties配置文件的缺点 yml配置⽂件 yml基本语法 yml和proper…

BUUCTF--[极客大挑战 2019]RCE ME

目录 URL编码取反绕过 异或绕过 异或的代码 flag 借助蚁剑中的插件进行绕过 利用动态链接库 编写恶意c语言代码 进行编译 然后再写一个php文件 将这两个文件上传到/var/tmp下 运行payload 直接看代码 <?php error_reporting(0); if(isset($_GET[code])){$code$_G…

Tag标签的使用

一个非常适合运用在vue项目中的组件&#xff1a;Tag标签。 目录 一、准备工作 1、安装element-plus库 2、配置element-plus库 二、Tag标签入门 1、打开element官网&#xff0c;搜索tag标签 2、体验Tag标签的基础用法 三、Tag标签进阶训练1 1、定义一个数组&#xff0c;…

学习threejs,使用createMultiMaterialObject创建多材质对象

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.SceneUtils 场景操控…

[C++]使用纯opencv部署yolov12目标检测onnx模型

yolov12官方框架&#xff1a;sunsmarterjie/yolov12 【算法介绍】 在C中使用纯OpenCV部署YOLOv12进行目标检测是一项具有挑战性的任务&#xff0c;因为YOLOv12通常是用PyTorch等深度学习框架实现的&#xff0c;而OpenCV本身并不直接支持加载和运行PyTorch模型。然而&#xff…

MQ(Message Queue)

目录 MQ(Message Queue)基本概念 为什么要使用消息队列&#xff1f; 使用消息队列有什么缺点&#xff1f; 如何保证消息不丢失?(如何保证消息的可靠性传输?/如何处理消息丢失的问题?) 通用的MQ场景&#xff1a; RabbitMQ如何保证消息不丢失&#xff1f; 生产者丢数据…

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

项目实战--网页五子棋(匹配模块)(4)

上期我们完成了游戏大厅的前端部分内容&#xff0c;今天我们实现后端部分内容 1. 维护在线用户 在用户登录成功后&#xff0c;我们可以维护好用户的websocket会话&#xff0c;把用户表示为在线状态&#xff0c;方便获取到用户的websocket会话 package org.ting.j20250110_g…

浏览器下载vue.js.devtools,谷歌浏览器和edg浏览器

1、谷歌浏览器下载&#xff1a; 情况一&#xff1a;如果谷歌应用商店可以打开&#xff0c;那么就直接到谷歌应用商店下载&#xff0c;直接搜索vue.js.devtools添加扩展即可。 情况二&#xff1a;谷歌浏览器的谷歌应用商城打不开&#xff0c;那么就百度搜索极简插件找到vue.js.…

基于TensorFlow.js与Web Worker的智能证件照生成方案

功能简介 本文基于TensorFlow.js与Web Worker实现了常用的“证件照”功能&#xff0c;可以对照片实现抠图并替换背景。值得一提的是&#xff0c;正常抠图的操作应该由后端进行&#xff0c;这里只是主要演示该功能实现步骤&#xff0c;并不建议该功能由前端全权处理。 限于个人技…

3D模型在线转换工具:轻松实现3DM转OBJ

3D模型在线转换是一款功能强大的在线工具&#xff0c;支持多种3D模型格式的在线预览和互转。无论是工业设计、建筑设计&#xff0c;还是数字艺术领域&#xff0c;这款工具都能满足您的需求。 3DM与OBJ格式简介 3DM格式&#xff1a;3DM是一种广泛应用于三维建模的文件格式&…

GEO数据结构

目录 1. GEOADD 2. GEODIST 3. GEOHASH 3. GEOHASH 4. GEOPOS 6. GEOSEARCH 7. GEOSEARCHSTORE 应用场景 代码的逻辑分解&#xff1a; 比较难懂的部分&#xff1a; Redis GEO 查询与分页 results 的结构&#xff1a; 分页处理与截取数据 附加距离信息 1. GEOADD…

Java基础常见的面试题(易错!!)

面试题一&#xff1a;为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”&#xff08;又称 “钻石问题”&#xff09;&#xff0c;即一个子类从多个父类继承到同名方法或属性时&#xff0c;编译器无法确定该调用哪个父类的成员。同时&#xff0c;多继承…

基于Python/Flask/机器学习链家网新房数据可视化及预测系统+万字文档+答辩PPT+指导搭建视频

技术栈&#xff1a; 编程语言&#xff1a;python 涉及技术&#xff1a;requests爬虫、mysql数据库、flask框架、scikit-learn机器学习预测算法、多元线性回归、Echarts可视化。 ①.需求分析&#xff1a; 1.数据爬取&#xff1a;自动化获取链家网新房数据。 2.数据存储&…

【DeepSeek-R1背后的技术】系列十一:RAG原理介绍和本地部署(DeepSeekR1+RAGFlow构建个人知识库)

【DeepSeek-R1背后的技术】系列博文&#xff1a; 第1篇&#xff1a;混合专家模型&#xff08;MoE&#xff09; 第2篇&#xff1a;大模型知识蒸馏&#xff08;Knowledge Distillation&#xff09; 第3篇&#xff1a;强化学习&#xff08;Reinforcement Learning, RL&#xff09;…

力扣LeetCode:1656 设计有序流

题目&#xff1a; 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) 对&#xff0c;并在多次调用时 按 id 递增的顺序…

MATLAB在数据分析和绘图中的应用:从基础到实践

引言 股票数据分析是金融领域中的重要研究方向&#xff0c;通过对历史价格、成交量等数据的分析&#xff0c;可以帮助投资者更好地理解市场趋势和做出决策。MATLAB作为一种强大的科学计算工具&#xff0c;提供了丰富的数据处理和可视化功能&#xff0c;非常适合用于股票数据的…