3. 修改员工
需求:修改员工信息
在进行修改员工信息的时候,我们首先先要根据员工的ID查询员工的信息用于页面回显展示,然后用户修改员工数据之后,点击保存按钮,就可以将修改的数据提交到服务端,保存到数据库。 具体操作为:
-
根据记录的ID进行查询用于页面回显展示员工信息{查询回显}
-
保存修改的员工信息提交到服务端,保存到数据库{更新数据库表当中的数据}
3.1 查询回显
3.1.1 接口文档
- 基本信息
- 请求参数
参数格式:路径参数
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | 员工ID |
请求参数样例:
响应数据
参数格式:application/json
参数说明:
名称 | 类型 | 是否必须 | 默认值 | 备注 |
---|---|---|---|---|
code | number | 必须 | 响应码, 1 成功 , 0 失败 | |
msg | string | 非必须 | 提示信息 | |
data | object | 必须 | 返回的数据 | |
|- id | number | 非必须 | id | |
|- username | string | 非必须 | 用户名 | |
|- name | string | 非必须 | 姓名 | |
|- password | string | 非必须 | 密码 | |
|- entrydate | string | 非必须 | 入职日期 | |
|- gender | number | 非必须 | 性别 , 1 男 ; 2 女 | |
|- image | string | 非必须 | 图像 | |
|- job | number | 非必须 | 职位, 说明: 1 班主任,2 讲师, 3 学工主管, 4 教研主管, 5 咨询师 | |
|- deptId | number | 非必须 | 部门id | |
|- createTime | string | 非必须 | 创建时间 | |
|- updateTime | string | 非必须 | 更新时间 |
响应数据样例:
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
参数说明:
名称 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | id |
username | string | 必须 | 用户名 |
name | string | 必须 | 姓名 |
gender | number | 必须 | 性别, 说明: 1 男, 2 女 |
image | string | 非必须 | 图像 |
deptId | number | 非必须 | 部门id |
entrydate | string | 非必须 | 入职日期 |
job | number | 非必须 | 职位, 说明: 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 前后端联调测试
掌握基于页面原型和接口文档来开发功能接口的能力。