删除员工信息和全局异常处理

删除员工:

  • 删除员工信息,根据员工的id删除
  • 其实批量删除就是一种特殊的批量删除,所以,删除员工的功能,我们只需要开发一个接口就可以了。

删除员工的逻辑分析:

controller层获取请求的参数:

接收请求参数:DELETE /emps?ids=1,2,3

通过数组来接收:

自己写的controller

    /**
     * 批量删除  参数--数组
     * @param ids
     * @return
     */
    @DeleteMapping
    public Result delByIds(Integer[] ids){
         log.info("要删除的数据:{}", Arrays.toString(ids));
        return Result.success();
    }

在Apifox里面测试:

在idea的控制台查看接收到的参数:

通过集合删除:

    /**
     * 批量删除
     * @param ids
     * @return
     */
    @DeleteMapping
    public Result del(@RequestParam List<Integer> ids){
        log.info("集合接收批量删除的id{}",ids);
        empService.delete(ids);
        return Result.success();
    }

在Apifox测试:

在控制台查看要删除的数据id

编写empService接口:

编写empServiceImpl的实现类:

因为删除员工基本信息的时候,还有把员工的工作经历删除,所以要删除两张表,同时为了保证数据库的完整性和一致性,我开启了事务。

 

    @Transactional
    @Override
    public void delete(List<Integer> ids) {
        //调用批量删除员工的接口
        empMapper.delByIds(ids);
        //调用批量删除工作经历的接口
        empExprMapper.delByEmpId(ids);
    }

编写EmpMapper接口:
 

    void delByIds(List<Integer> ids);

编写EmpMapperXml配置文件

    <delete id="delByIds">
        delete from emp where  id in
          <foreach collection="ids" item="id" separator="," open="(" close=")">
              #{id}
          </foreach>
    </delete>

编写EmpExprMapper接口:

  void delByEmpId(List<Integer> ids);

现在就可以在Apifox里面测试了:

最后总结:

修改员工:

大概执行思路:

查询回显:

自定义结果集:

resultMap标签:

Mybatis中封装查询结果,什么时候用 resultType,什么时候用resultMap?

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

resultMap标签详解:

用于将查询结果映射到Java对象的标签。

id:此resultMap标签的唯一标识

type:数据要映射的类型

<id></id>标签

<id></id>常用于封装数据库表的主键id

   常用的属性:

                column:要映射的数据库字段

                property:要映射的数据库属性名      

<result></result>标签

<result></result>常用于封装数据库表的普通字段

常用的属性:

                column:要映射的数据库字段

                property:要映射的数据库属性名   

<collection></collection>标签:

<collection></collection>常用于封装一个集合的数据

        

property:要封装的数据类型
ofType:要封装的单条数据类型

在collection标签里面也是写 

id标签和result标签

编写EmpController层接口:

    /**
     * 根据id查询员工信息
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id){
       Emp emp =  empService.getById(id);
        return Result.success(emp);
    }

编写:EmpService接口:

 Emp getById(Integer id);

编写EmpServiceImpl实现类:

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

编写EmpMapper接口:

Emp getById(Integer id);

编写EmpMapperXml配置文件:

    <resultMap id="emp_expr_map" type="com.sde.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"/>
        <collection property="exprList" ofType="com.sde.pojo.EmpExpr">
            <id column="er_id" property="id"/>
            <result column="er_emp_id" property="empId" />
            <result column="er_begin" property="begin" />
            <result column="er_end" property="end" />
            <result column="er_company" property="company" />
            <result column="er_job" property="job" />
        </collection>
    </resultMap>

    <select id="getById" resultMap="emp_expr_map">
        select e.*,er.id er_id,er.emp_id er_emp_id,er.begin er_begin,
         er.end er_end,er.company er_company,er.job er_job from emp e left join emp_expr er
        on e.id = er.emp_id where e.id = #{id}
    </select>

前后端联调测试:

修改信息:

根据id修改员工信息,但是我们思考一下,在修改员工信息的时候,我们还要对员工的工作经历进行处理。想到了一个简单便捷的方法,就是不管我的员工经历信息,改没改,我都要以最后提交的为主。先删后加。

编写EmpController层:

    @PutMapping
    public Result update(@RequestBody Emp emp){
        log.info("要修改的参数信息:"+emp);
        empService.update(emp);
        return Result.success();
    }

编写EmpService接口:

   void update(Emp emp);

编写EmpServiceImpl实现类:

    @Transactional
    @Override
    public void update(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        //先删除员工经历表的数据
        empExprMapper.delByEmpId(Arrays.asList(emp.getId()));
        //修改员工基本信息
       empMapper.update(emp);
       //添加员工的工作经历信息
        List<EmpExpr> exprList = emp.getExprList();
        if (!CollectionUtils.isEmpty(exprList)){
            exprList.forEach(empExpr -> {
                empExpr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }
    }

编写 EmpMapper接口:

  void update(Emp emp);

编写EmpMapperXml配置文件:

<update id="update">
        update emp
        <set>
            <if test="username != null">
                username = #{username},
            </if>
            <if test="name != null">
                name = #{name},
            </if>
            <if test="gender != null">
                gender = #{gender},
            </if>
            <if test="phone != null">
                phone = #{phone},
            </if>
            <if test="image != null">
                image = #{image},
            </if>
            <if test="deptId != null">
                dept_id = #{deptId},
            </if>
            <if test="entryDate != null">
                entry_date = #{entryDate},
            </if>
            <if test="job != null">
                job = #{job},
            </if>
            <if test="salary != null">
                salary = #{salary},
            </if>
       </set>
        <where>
            id = #{id}
        </where>
    </update>

编写EmpExprMapper接口:
批量删除员工的工作经历:

void delByEmpId(List<Integer> ids);

编写批量添加的接口:

 


    /**
     * 批量添加员工经历的数据
     * @param exprList
     */
    void insertBatch(List<EmpExpr> exprList);

编写EmpExprMapperxml配置文件:

 

<insert id="insertBatch">
        insert into emp_expr(emp_id,begin,end,company,job) values
        <foreach collection="exprList" item="expr" separator=",">
            (#{expr.empId},#{expr.begin},#{expr.end},#{expr.company},#{expr.job})
        </foreach>
    </insert>
    <delete id="delByEmpId">
        delete from emp_expr where emp_id in
          <foreach collection="ids" item="id" separator="," open="(" close=")">
              #{id}
          </foreach>
    </delete>

异常处理:

在项目开发中难免会出现异常,这是不可避免的。在前面我们编写的接口中,也会出现报错,但是我们都是怎么直接就把错误的信息返回给前端页面了。

现在各层代码出现异常,我们是如何进行处理的?答案是:未做处理。

可以在学到javase的时候出现异常可以 抛出异常和try/catch,但是这样显得太繁琐

我们可以定义一个全局异常处理器

我们在com.sde包下创建一个exception包,里面创建一个全局异常处理器类

在类上面添加@RestControllerAdvice注解

在方法上面添加@ExceptionHandle注解:

GlobalExceptionHandle全局异常类

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandle {

    @ExceptionHandler
    public Result ExceptionHandle(Exception e){
        log.error("程序运行出错了...",e);
        return Result.error("对不起,程序运行出错,请联系管理员~");
    }

    @ExceptionHandler
    public Result handleBusinessException(BusinessException e){
        log.info("程序运行出错");
        return Result.error(e.getMessage());
    }
    
}

这样我们人为程序制造一个异常。

 if (true){
      throw new RuntimeException("人为制造的异常");
       }

前后端联调测试:

看看idea控制台

我们定义的全局异常,生效了。

假如我们有很多异常,不同种类的异常时如何捕获的呢??

下面我人为写一个io异常,看看是先执行Exception还是执行IoException异常

    @ExceptionHandler
    public Result ioException(IOException e){
        log.info("精准匹配异常");
        return Result.error("出现io异常");
    }

前后联调测试:

看看idea控制台:

可以发现,我人为制造的io异常捕获到了这个异常数据,

全局异常捕获,先是小范围的精准匹配,然后要是匹配不到,就像大范围寻找,最后没有,就会抛出父类的异常,Exception异常。

员工信息统计:

职位统计:

执行思路流程:

mysql的case函数:

语法一:

case when cond1 then res1 [when cond2 then res2] else res end ;

语法二:

语法二(适用于等值匹配):

编写JobData实体类:

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

编写 ReportController层:

    /**
     * 员工和职位人数统计
     * @return
     */
    @GetMapping("/empJobData")
    public Result empJobData(){
        JobData jobData =  reportService.getJobData();
        return Result.success(jobData);
    }

编写reportService接口:

 JobData getJobData();

编写ReportServiceImpl实现类:

    @Override
    public JobData getJobData() {
        List<Map> jobData = empMapper.getJobData();
        System.out.println(jobData);
        List<Object> jobList = jobData.stream().map(map -> {
            return map.get("pos");
        }).toList();
        System.out.println(jobList);
        List<Object> countList = jobData.stream().map(map -> {
            return map.get("posCount");
        }).toList();
        return new JobData(jobList,countList);
    }

编写EmpMapper接口:

 

    @MapKey("pos")
    List<Map> getJobData();

编写EmpMapperxml配置文件:

    <select id="getJobData" resultType="java.util.Map">
        select count(*) posCount,
               (case job when 1 then '班主任'
                         when 2 then '讲师'
                         when 3 then '学工主管'
                         when 4 then '教研主管'
                         when 5 then '咨询师'
                         else '其他' end) pos
        from emp group by job;
    </select>

前后端联调测试:

性别统计:

if流程控制函数:
  • if(expr,val1,val2):如果表达式expr成立,取val1,否则取val2
  • ifnull(expr,val1):如果expr不为null,取自身,否则取val1

如果查询的记录往Map中封装,可以通过@MapKey注解指定返回的map中的唯一标识是那个字段。【也可以不指定】

编写ReportController层接口:

    /**
     * 员工性别统计
     * @return
     */
    @GetMapping("/empGenderData")
    public Result empGenderData(){
           List<Map> mapList =  reportService.getGenderData();
        return Result.success(mapList);
    }

 编写ReportService接口:

   List<Map> getGenderData();

编写ReportServiceImpl实现类:

    @Override
    public List<Map> getGenderData() {
        return empMapper.genderData();
    }

编写EmpMapper接口:

 List<Map> genderData();

编写EmpMapperxml实现类:

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

前后端联调测试:

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

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

相关文章

大模型微调的“温度”参数,原来影响的是 softmax

大家好啊&#xff0c;我是董董灿。 在对大模型进行微调训练时&#xff0c;经常会看到几个重要的超参数&#xff0c;用来控制大模型生成文本的效果。 其中一个超参数叫做 Temperature&#xff0c;中文名字叫温度&#xff0c;初见时很是不解&#xff0c;为啥一个模型还有温度这个…

【问题处理】—— lombok 的 @Data 大小写区分不敏感

问题描述 今天在项目本地编译的时候&#xff0c;发现有个很奇怪的问题&#xff0c;一直提示某位置找不到符号&#xff0c; 但是实际在Idea中显示确实正常的&#xff0c;一开始以为又是IDEA的故障&#xff0c;所以重启了IDEA&#xff0c;并执行了mvn clean然后重新编译。但是问…

36、什么是池化算法

池化算法也是 CNN 网络中非常常见的算法。 池化这一算法理解起来比较简单,从名字中或许可以看到一些东西:从一个像素池子中选取一些有代表性的像素出来。 常见的池化有最大池化和平均池化。最大池化就是从像素池子中选取最大值出来,而平均池化就是从像素池子中选取平均值出…

Ganache结合内网穿透实现远程或不同局域网进行连接访问

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

一文搞清楚“并发与并行”“串行与并行”“线程与进程”的区别

目录 &#x1f436;6.1 并发与并行 &#x1f436;6.2 串行与并行 1. 基本概念 2. 举个&#x1f330; 3. 适用场景 &#x1f436;6.3 线程与进程 1. 基本概念 2. 进程与线程的区别 3. 线程调度: &#x1f436;6.1 并发与并行 并行&#xff1a;指两个或多个事件在同一时…

2023年OceanBase开发者大会-核心PPT资料下载

一、峰会简介 2023年OceanBase开发者大会主要涵盖了OceanBase的最新技术进展、产品更新以及开发者工具的发布。大会发布了OceanBase 4.1版本&#xff0c;公布了两大友好工具&#xff0c;升级了文档的易用性&#xff0c;并统一了企业版和社区版的代码分支。这些举措全面呈现了O…

【算法题】开源项目热度榜单(js)

解法 const lines ["4","8 6 2 8 6","camila 66 70 46 158 80","victoria 94 76 86 189 211","athony 29 17 83 21 48","emily 53 97 1 19 218", ]; const lines2 ["5","5 6 6 1 2","…

Python:pipdeptree 语法介绍

相信大家在按照一些包的时候经常会碰到版本不兼容&#xff0c;但是又不知道版本之间的依赖关系&#xff0c;今天给大家介绍一个工具&#xff1a;pipdeptree pipdeptree 是一个 Python 包&#xff0c;用于查看已安装的 pip 包及其依赖关系。它以树形结构展示包之间的依赖关系&am…

json Deserialization of Python Objects

openweathermap.json {"coord": {"lon": 114.0683, "lat":22.5455},"weather":[ {"id": 803, "main":"Clouds", "description":"多云", "icon":"04d"}],"…

产品Axure的安装以及组件介绍

Axure介绍&#xff1a; Axure是一款用户体验设计工具&#xff0c;可以用于创建交互式原型、线框图和设计文档。它支持快速原型开发、界面设计、信息架构、流程图和注释等功能&#xff0c;可以帮助设计师快速地创建和共享交互式原型&#xff0c;从而更好地与客户和团队协作。 …

利用Pytorch预训练模型进行图像分类

Use Pre-trained models for Image Classification. # This post is rectified on the base of https://learnopencv.com/pytorch-for-beginners-image-classification-using-pre-trained-models/# And we have re-orginaized the code script.预训练模型(Pre-trained models)…

回溯热门问题

关卡名 回溯热门问题 我会了✔️ 内容 1.组合总和问题 ✔️ 2.分割回文串问题 ✔️ 3.子集问题 ✔️ 4.排列问题 ✔️ 5.字母全排列问题 ✔️ 6.单词搜索 ✔️ 1. 组合总和问题 LeetCode39题目要求&#xff1a;给你一个无重复元素的整数数组candidates和一个目标整数 ta…

数据结构学习 12字母迷宫

dfs 回溯 剪枝 这个题和dfs有关&#xff0c;但是我之前没有接触过&#xff0c;我看了这一篇很好的文章&#xff0c;看完之后写的答案。 我觉得很好的总结&#xff1a; dfs模板 int check(参数) {if(满足条件)return 1;return 0; }void dfs(int step) {判断边界{相应操作}尝试…

自考 00023高等数学考点整理

空间直角坐标系 右手法则 向量 点到点的距离 点到直线的距离点到平面的距离向量平行向量垂直向量投影向量数乘 a*b axb(行列式计算)直线夹角、直线与平面夹角平面点法式方程空间直角坐标系 右手法则向量数量积、向量积 平行四边形法则、三角形法则 第二章 多元函数 微分学…

VS2022 将项目打包,导出为exe运行

我有一个在 VS2022 上开发的程序&#xff0c;基于.net 6框架, 想打包成 .exe程序&#xff0c;以在另一个没有安装VS的机器上运行&#xff0c;另一个机器是Win7系统&#xff0c;上面安装了.net 6框架。 虽然网上很多教程&#xff0c;需要安装Project Installer&#xff0c;配置A…

从零开始创建一个项目,springBoot+mybatisPlus+mysql+swagger+maven

一&#xff0c;前提 从零开始创建一个项目&#xff0c;绑定了数据库 用到的技术栈&#xff1a;springBootmybatisPlusmysqlswaggermaven 二&#xff0c;创建项目步骤 1&#xff0c;创建项目 创建出来的项目结构如图所示 2&#xff0c;修改配置文件 因为我比较习惯yml语言&…

算法:最小生成树

文章目录 生成树Kruskal算法Prim算法 本篇总结的是最小生成树算法 生成树 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树就不在连通&#xff1b;反之&#xff0c;在其中引入任何一条新边&…

路由器交换机配置备份工具

本文主要介绍fast-backup 2.0软件的使用&#xff0c;fast-backup 2.0是可以在任何Windows系统上运行的网络运维软件&#xff0c;帮助运维人员减少大量重复的交换机等设备的配置下载工作&#xff0c;支持的厂商有华为和华三的网络设备和安全设备。 功能特性&#xff1a; 支持S…

提升数据分析效率:Amazon S3 Express One Zone数据湖实战教程

前言 什么是 Amazon S3&#xff1f;什么是 S3 Express One Zone&#xff1f;实现概述 技术架构组件实现步骤概览 第一步&#xff1a;构建数据湖的基础第二步&#xff1a;选择并查看数据集第三步&#xff1a;在 Athena 中搭建架构第四步&#xff1a;数据转换与优化第五步&#x…

数组笔试题解析(下)

数组面试题解析 字符数组 &#xff08;一&#xff09; 我们上一篇文章学习了一维数组的面试题解析内容和字符数组的部分内容&#xff0c;我们这篇文章讲解一下字符数组和指针剩余面试题的解析内容&#xff0c;那现在&#xff0c;我们开始吧。 我们继续看一组字符数组的面试…