SpringBootWeb案例 Part 4

3. 修改员工

需求:修改员工信息

 

在进行修改员工信息的时候,我们首先先要根据员工的ID查询员工的信息用于页面回显展示,然后用户修改员工数据之后,点击保存按钮可以将修改的数据提交到服务端,保存到数据库。 具体操作为:

  1. 根据记录的ID进行查询用于页面回显展示员工信息{查询回显}

  2. 保存修改的员工信息提交到服务端,保存到数据库{更新数据库表当中的数据}

3.1 查询回显

3.1.1 接口文档

  • 基本信息  

 

  • 请求参数

参数格式:路径参数

参数说明:

参数名类型是否必须备注
idnumber必须员工ID

请求参数样例:

响应数据

参数格式:application/json

参数说明:

名称类型是否必须默认值备注
codenumber必须响应码, 1 成功 , 0 失败
msgstring非必须提示信息
dataobject必须返回的数据
|- idnumber非必须id
|- usernamestring非必须用户名
|- namestring非必须姓名
|- passwordstring非必须密码
|- entrydatestring非必须入职日期
|- gendernumber非必须性别 , 1 男 ; 2 女
|- imagestring非必须图像
|- jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师
|- deptIdnumber非必须部门id
|- createTimestring非必须创建时间
|- updateTimestring非必须更新时间

响应数据样例:

3.1.2 实现思路

  • 通过@PathVariable注解接收请求路径中的路径参数!

3.1.3 代码实现

EmpController 

package com.gch.controller;

import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;
import com.gch.pojo.Result;
import com.gch.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.List;

/**
   员工管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
    @Autowired
    private EmpService empService;

    /**
     * 条件分页查询
     * @param page 分页查询的页码
     * @param pageSize 分页查询的每页展示记录数
     * @param name 姓名
     * @param gender 性别
     * @param begin 入职日期的开始时间
     * @param end 入职日期的结束时间
     * 默认值的设置可以通过注解@RequestParam中的defaultValue()属性来指定默认值
     * 用@DateTimeFormat注解中的pattern属性指定日期时间类型的格式
     * 注意:方法签名上的形参变量名需要于接口文档中的请求参数名保持一致
     * @return
     */
    @GetMapping
    public Result page(@RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize,
                       String name, Short gender,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
//        设置默认值,但写法比较繁琐
//        if(page == null) {page = 1;}
//        if(pageSize == null) {pageSize = 10;}
        // 记录日志
        log.info("条件分页查询,参数:page:{},pageSize:{},name:{},gender:{},begin:{},end:{}",page,pageSize,name,gender,begin,end);

        // 调用service分页查询
        PageBean pageBean = empService.page(page,pageSize,name,gender,begin,end);

        // 响应
        return Result.success(pageBean);
    }

    /**
     * 批量删除员工信息
     * @param ids 接收前端传递过来的路径参数id数组
     * @return
     */
    @DeleteMapping("/{ids}")
    public Result delete(@PathVariable List<Integer> ids) {
        // 记录日志
        log.info("批量删除员工,ids:{}",ids);
        // 调用service批量删除
        empService.delete(ids);
        // 响应
        return Result.success();
    }


    /**
     * 新增员工
     * @param emp 员工对象
     * 在Controller中使用@RequestBody注解接收前端传递的JSON格式的数据并填充到实体类中
     * @return 返回统一响应结果
     */
    @PostMapping
    public Result save(@RequestBody Emp emp) {
        // 记录日志
        log.info("新增员工 , emp:{}",emp);
        // 调用service添加员工
        empService.save(emp);
        // 响应
        return Result.success();
    }

    /**
     * 根据主键ID进行员工信息查询
     * @param id 主键ID
     * @return 响应统一结果
     * 在Controller中通过@PathVariable注解接收请求路径中的路径参数
     */
    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        // 1.记录日志
        log.info("根据id查询员工信息,id:{}",id);
        // 2.调用service查询
        Emp emp = empService.selectById(id);
        // 3.响应
        return Result.success(emp);
    }
}

EmpService 

package com.gch.service;

import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;

import java.time.LocalDate;
import java.util.List;

/**
   员工业务规则
 */
public interface EmpService {
    /**
     * 条件分页查询
     * @param page     => 分页查询的页码
     * @param pageSize => 分页查询的每页展示记录数
     * @param name => 姓名
     * @param gender => 性别
     * @param begin => 入职日期的开始时间
     * @param end => 入职日期的结束时间
     * @return
     */
    PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end);

    /**
     * 批量删除员工信息操作
     * @param ids 前端传递过来的路径参数id集合
     */
    void delete(List<Integer> ids);

    /**
     * 添加员工
     * @param emp 员工对象
     */
    void save(Emp emp);

    /**
     * 根据主键ID查询员工
     * @param id 主键ID
     * @return 返回员工对象
     */
    Emp selectById(Integer id);
}

EmpServiceImpl 

package com.gch.service.impl;

import com.gch.mapper.EmpMapper;
import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;
import com.gch.service.EmpService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
   员工业务实现类
 */
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;

    /**
     * 原始分页查询
     * @param page     => 分页查询的页码
     * @param pageSize => 分页查询的每页展示记录数
     * @return
     */
//    @Override
//    public PageBean page(Integer page, Integer pageSize) {
//        // 1.获取总记录数
//        Long total = empMapper.count();
//
//        // 2.获取分页查询的数据列表
//        List<Emp> rows = empMapper.pageSelect((page - 1) * pageSize,pageSize);
//
//        // 3.封装PageBean对象
//        return new PageBean(total,rows);
//    }

    /**
     * 基于PageHelper分页插件实现分页查询
     * @param page     => 分页查询的页码
     * @param pageSize => 分页查询的每页展示记录数
     * @param name => 姓名
     * @param gender => 性别
     * @param begin => 入职日期的开始时间
     * @param end => 入职日期的结束时间
     * @return
     */
    @Override
    public PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end){
        // 1.设置分页参数
        PageHelper.startPage(page,pageSize);

        // 2.执行条件分页查询
        List<Emp> empList = empMapper.list(name,gender,begin,end);
        // 获取条件分页查询结果
        Page<Emp> p = (Page<Emp>)empList;

        // 3.封装PageBean对象并返回
        return new PageBean(p.getTotal(),p.getResult());
    }

    /**
     * 批量删除员工信息
     * @param ids 前端传递过来的路径参数id集合
     */
    @Override
    public void delete(List<Integer> ids) {
        empMapper.deleteById(ids);
    }

    /**
     * 添加员工
     * @param emp 员工对象
     */
    @Override
    public void save(Emp emp) {
        // 1.补全员工数据 / 属性
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        // 2.调用mapper层新增员工方法
        empMapper.add(emp);
    }

    /**
     * 根据主键ID进行员工查询
     * @param id 主键ID
     * @return 返回员工对象
     */
    @Override
    public Emp selectById(Integer id) {
        return empMapper.selectById(id);
    }
}
package com.gch.mapper;

import com.gch.pojo.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDate;
import java.util.List;

/**
   员工管理
 */
@Mapper
public interface EmpMapper {

    /**
     * 查询总记录数
     * @return
     */
//    @Select("select count(*) from tlias.emp")
//    public Long count();

    /**
     * 分页查询,获取数据列表/获取列表数据
     * @param startIndex => 起始索引
     * @param pageSize => 每页展示记录数
     * @return
     */
//    @Select("select * from tlias.emp limit #{startIndex},#{pageSize}")
//    public List<Emp> pageSelect(Integer startIndex,Integer pageSize);

    /**
     * 基于PageHelper进行员工信息条件分页查询
     * 查询条件参数:
     *   @param name => 姓名
     *   @param gender => 性别
     *   @param begin => 入职日期的开始时间
     *   @param end => 入职日期的结束时间
     * @return
     */
    public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);

    /**
     * 批量删除员工信息
     * @param ids 前端传递过来的路径参数id集合
     */
    void deleteById(List<Integer> ids);

    /**
     * 新增/插入员工
     * @param emp 员工对象
     */
    @Insert("insert into tlias.emp(username, name, gender, image, job, entrydate, dept_id, create_time, update_time) " +
            "values(#{username},#{name},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")
    void add(Emp emp);

    /**
     * 根据主键ID进行员工信息查询
     * @param id 主键ID
     * @return 返回员工对象
     */
    @Select("select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from tlias.emp where id = #{id}")
    Emp selectById(Integer id);
}

3.1.4 启动项目,Postman测试

 

3.1.5 前后端联调 - 查询回显

 

3.2 修改员工

 

当数据查询回显之后,就可以在表单当中展示出原来的数据,接下来就可以在原来数据的基础上来修改员工的基本信息。 

当用户修改完数据之后,点击保存按钮,就需要将数据提交到服务端,然后服务端需要将修改后的数据更新到数据库中。  

3.2.1 接口文档

  • 基本信息

 

  • 请求参数

参数格式:application/json

参数说明:

名称类型是否必须备注
idnumber必须id
usernamestring必须用户名
namestring必须姓名
gendernumber必须性别, 说明: 1 男, 2 女
imagestring非必须图像
deptIdnumber非必须部门id
entrydatestring非必须入职日期
jobnumber非必须职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师

请求数据样例:  

 

  • 思考:更新员工数据的时候是根据主键ID来进行更新的,因为更新的时候除了主键ID不能变,其它都有可能发生变化。 
  • 响应数据

参数格式:application/json

参数说明:

响应数据样例:  

 

3.2.2 实现思路

SQL语句:  

-- update语法:update 表名 set 字段名1 = 值1, 字段名2 = 值2,...[where 条件];
-- 更新员工
update emp
set username    = '',
    password    = '',
    name        = ',',
    gender      = ?,
    image       = '',
    job         = ?,
    entrydate   = ?,
    dept_id     = ?,
    update_time = ?
where id = ?;

3.2.3 代码实现

  • EmpController
package com.gch.controller;

import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;
import com.gch.pojo.Result;
import com.gch.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.List;

/**
   员工管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
    @Autowired
    private EmpService empService;


    /**
     * 修改员工
     * @param emp 员工对象
     * @return 响应
     * 在Controller中通过@RequestBody注解接收前端传递过来的JSON格式的数据并填充到实体类中
     */
    @PutMapping
    public Result updateById(@RequestBody Emp emp) {
        // 1.记录日志
        log.info("修改员工,emp:{}",emp);
        // 2.调用service修改员工
        empService.update(emp);
        // 3.响应
        return Result.success();
    }
}
  • EmpService
package com.gch.service;

import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;

import java.time.LocalDate;
import java.util.List;

/**
   员工业务规则
 */
public interface EmpService {
    /**
     * 修改员工
     * @param emp
     */
    void update(Emp emp);
}
  •  EmpServiceImpl
package com.gch.service.impl;

import com.gch.mapper.EmpMapper;
import com.gch.pojo.Emp;
import com.gch.pojo.PageBean;
import com.gch.service.EmpService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

/**
   员工业务实现类
 */
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;

    /**
     * 修改员工
     * @param emp 员工对象
     */
    @Override
    public void update(Emp emp) {
        // 1.补全员工属性
        emp.setUpdateTime(LocalDateTime.now());
        // 2.调用mapper层修改员工
        empMapper.updateById(emp);
    }
}
  • EmpMapper
package com.gch.mapper;

import com.gch.pojo.Emp;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDate;
import java.util.List;

/**
   员工管理
 */
@Mapper
public interface EmpMapper {

    /**
     * 修改员工
     * @param emp 员工对象
     */
    void updateById(Emp emp);
}
  • EmpMapper.xml 
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gch.mapper.EmpMapper">
    <!-- 动态更新员工信息 SQL语句中的id需要与mapper接口方法名保持一致-->
    <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="image != null and image != ''">image= #{image},</if>
            <if test="job != null">job = #{job},</if>>
            <if test="entrydate != null">entrydate = #{entrydate},</if>
            <if test="deptId != null">dept_id = #{deptId},</if>
            <if test="updateTime != null">update_time = #{updateTime}</if>
        </set>
        where id = #{id}
    </update>
</mapper>

注意:动态更新员工信息 SQL语句中的id需要与mapper接口方法名保持一致! 

3.2.4 Postman测试

 

3.2.5 前后端联调测试

 

掌握基于页面原型和接口文档来开发功能接口的能力。 

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

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

相关文章

【校招VIP】产品思维分析之面试新的功能点设计

考点介绍&#xff1a; 这种题型是面试里出现频度最高&#xff0c;也是难度最大的一种&#xff0c;需要面试者对产品本身的功能、扩展性以及行业都有一定的了解。而且分析时间较短&#xff0c;需要一定的产品能力和回答技巧。 『产品思维分析之面试新的功能点设计』相关题目及解…

java+springboot+vue儿童慈善捐赠管理系统的设计与实现8n9e4

针对用户需求开发与设计&#xff0c;该技术尤其在各行业领域发挥了巨大的作用&#xff0c;有效地促进了“爱相连”儿童慈善管理的发展。然而&#xff0c;由于用户量和需求量的增加&#xff0c;信息过载等问题暴露出来&#xff0c;为改善传统线下管理中的不足&#xff0c;本文将…

Docker搭建LNMP----(超详细)

目录 ​编辑 一、项目环境 1.1 所有安装包下载&#xff1a; 1.3 服务器环境 1.4任务需求 二、Ngin 2.1、建立工作目录 2.2 编写 Dockerfile 脚本 2.3准备 nginx.conf 配置文件 2.4生成镜像 2.5创建自定义网络 2.6启动镜像容器 2.7验证 nginx、 三、Mysql 3.1建立…

传智教育广州校区又又又举行校内招聘会,多名学员被广东民生在线教育招入麾下

数字经济的高速发展以及经济形势的逐渐回暖&#xff0c;带动了企业对数字人才的用人需求增加&#xff0c;近日&#xff0c;传智教育旗下高端IT教育品牌黑马程序员多个校区接到了企业上门招聘的需求&#xff0c;各分校区通过举行校内招聘会&#xff0c;为用人企业和学员搭建了人…

一文速学-让神经网络不再神秘,一天速学神经网络基础-激活函数(二)

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

实验二 tftp 服务器环境搭建

tftp 服务器环境搭建 tftp&#xff08;Trivial File Transfer Protocol&#xff09;即简单文件传输协议是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为69 【实验目的】 掌握 tftp 环境搭…

【目标检测】“复制-粘贴 copy-paste” 数据增强实现

文章目录 前言1. 效果展示代码说明3. 参考文档4. 不合适点 前言 本文来源论文《Simple Copy-Paste is a Strong Data Augmentation Method for Instance Segmentation》&#xff08;CVPR2020&#xff09;&#xff0c;对其数据增强方式进行实现。 论文地址&#xff1a;https:/…

MediaPlayer音频与视频的播放介绍

作者&#xff1a;向阳逐梦 Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码和播放音视频。 它支持三种不同的媒体来源…

Talk | 上海交通大学官同坤:识别任意文本,隐式注意力与字符间蒸馏在文本识别中的应用

本期为TechBeat人工智能社区第525期线上Talk&#xff01; 北京时间8月23日(周三)20:00&#xff0c;上海交通大学博士生—官同坤的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “隐式注意力与字符间蒸馏在文本识别中的应用”&#xff0c;分享了识别…

使用docker-maven-plugin插件构建镜像并推送至私服Harbor

前言 如下所示&#xff0c;建议使用 Dockerfile Maven 插件&#xff0c;但该插件也停止维护更新了。因此先暂时使用docker-maven-plugin插件。 一、开启Docker服务器的远程访问 1.1 开启2375远程访问 默认的dokcer是不支持远程访问的&#xff0c;需要加点配置&#xff0c;开…

bh002- Blazor hybrid / Maui 保存设置快速教程

1. 建立工程 bh002_ORM 源码 2. 添加 nuget 包 <PackageReference Include"BootstrapBlazor.WebAPI" Version"7.*" /> <PackageReference Include"FreeSql" Version"*" /> <PackageReference Include"FreeSql.…

MyBatis分页插件PageHelper的使用及特殊字符的处理

目录 一、PageHelper简介 1.什么是分页 2.PageHelper是什么 3.使用PageHelper的优点 二、PageHelper插件的使用 原生limit查询 1. 导入pom依赖 2. Mybatis.cfg.xml 配置拦截器 3. 使用PageHelper进行分页 三、特殊字符的处理 1.SQL注入&#xff1a; 2.XML转义&#…

【Linux】【驱动】第一个相对完整的驱动编写

【Linux】【驱动】第一个相对完整的驱动编写 续1.驱动部分的代码2 app 代码3 操作相关的代码 续 这个章节会讲述去直接控制一个GPIO&#xff0c;高低电平。 因为linux不允许直接去操作寄存器&#xff0c;所以在操作寄存器的时候就需要使用到函数&#xff1a;ioremap 和iounma…

线性代数的学习和整理10:各种特殊类型的矩阵(草稿-----未完成 建设ing)

目录 1 图形化分类 1.1对称矩阵 1.2 梯形矩阵 1.3 三角矩阵 1.3.1 上三角矩阵 1.4 对角线矩阵 2 按各自功能分 2.1 等价矩阵 2.2 增广矩阵 2.3 伴随矩阵 2.4 正交矩阵 2.5 正交矩阵 2.6 相似矩阵 1 图形化分类 1.1对称矩阵 1.2 梯形矩阵 1.3 三角矩阵 1.3.1 上…

【ARM-Linux】项目,语音刷抖音项目

文章目录 所需器材装备操作SU-03T语音模块配置代码&#xff08;没有用wiring库&#xff0c;自己实现串口通信&#xff09;结束 所需器材 可以百度了解以下器材 orangepi-zero2全志开发板 su-03T语音识别模块 USB-TTL模块 一个安卓手机 一根可以传输的数据线 装备操作 安…

windows Etcd的安装与使用

一、简介 etcd是一个分布式一致性键值存储&#xff0c;其主要用于分布式系统的共享配置和服务发现。 etcd由Go语言编写 二、下载并安装 1.下载地址&#xff1a; https://github.com/coreos/etcd/releases 解压后的目录如下&#xff1a;其中etcd.exe是服务端&#xff0c;e…

C语言弯道超车必做好题锦集(编程题)

目录 前言&#xff1a; 1.计算日期到天数转换 2.尼科彻斯定理 3.密码检查 4.图片整理 5.寻找数组的中心下标 6.字符个数统计 7.多数元素 前言&#xff1a; 编程想要学的好&#xff0c;刷题少不了&#xff0c;我们不仅要多刷题&#xff0c;还要刷好题&#xff01;为此我…

C# .aspx网页获取RFID读卡器HTTP协议提交的访问文件Request获得卡号、机号,Response回应驱动读卡器显示响声

本示例使用的设备&#xff1a;RFID网络WIFI无线TCP/UDP/HTTP可编程二次开发读卡器POE供电语音-淘宝网 (taobao.com) 服务端代码&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.…

iptables的使用规则

环境中为了安全要限制swagger的访问&#xff0c;最简单的方式是通过iptables防火墙设置规则限制。 在测试服务器中设置访问swagger-ui.html显示如下&#xff0c;区分大小写&#xff1a; iptables设置限制访问9783端口的swagger字段的请求&#xff1a; iptables -A INPUT -p t…

Python可视化工具库实战

Matplotlib Matplotlib 是 Python 的可视化基础库&#xff0c;作图风格和 MATLAB 类似&#xff0c;所以称为 Matplotlib。一般学习 Python 数据可视化&#xff0c;都会从 Matplotlib 入手&#xff0c;然后再学习其他的 Python 可视化库。 Seaborn Seaborn 是一个基于 Matplo…