查询员完成之后,我们继续开发新的功能:删除员工。
3.3.1 需求
当我们勾选列表前面的复选框,然后点击 "批量删除" 按钮,就可以将这一批次的员工信息删除掉了。也可以只勾选一个复选框,仅删除一个员工信息。
问题:我们需要开发两个功能接口吗?一个删除单个员工,一个删除多个员工
答案:不需要。 只需要开发一个功能接口即可(删除多个员工包含只删除一个员工)
3.3.2 接口文档
删除员工
-
基本信息
请求路径:/emps/{ids}
请求方式:DELETE
接口描述:该接口用于批量删除员工的数据信息
请求参数
参数格式:路径参数
参数说明:
参数名 | 类型 | 示例 | 是否必须 | 备注 |
---|---|---|---|---|
ids | 数组 array | 1,2,3 | 必须 | 员工的id数组 |
请求参数样例:
/emps/1,2,3
响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{
"code":1,
"msg":"success",
"data":null
}
3.3.3 思路分析
接口文档规定:
-
前端请求路径:/emps/{ids}
-
前端请求方式:DELETE
问题1:怎么在controller中接收请求路径中的路径参数?
@PathVariable
问题2:如何限定请求方式是delete?
@DeleteMapping
问题3:在Mapper接口中,执行delete操作的SQL语句时,条件中的id值是不确定的是动态的,怎么实现呢?
Mybatis中的动态SQL:foreach
流程:实现思路
前端发起请求 请求到达Controller之后 Controller定义一个方法来接收请求
那就需要在方法在加上一个注解@DeleteMapping 然后在Controller方法中去接收路径参数
而由于是一个路径参数 所以我们要在方法的形参上加上一个注解@PathVariable 来指定 我们接收是一个路径参数
接收到路径参数之后 接下来 就要调用Service进行批量删除操作 而在Service当中在调Mapper执行批量删除 最后执行批量删除的SQL语句 来执行删除的操作就可以了
删除完成之后 在给前端一个统一响应结果就可以
在Mapper接口当中 我们在去执行SQL语句的时候 后面的id列表并不是固定的 (1,2,3)
delete from emp where id in (1,2,3);
这个id是前端传递过来的路径参数 我们接收到路径参数之后 我们需要将它封装到一个数组或是集合当中
那么在Mapper接口当中 就需要去遍历数组或是集合最终来动态的组装后面的部分
这一块 我们之前 讲解baytis的时候就已经完成了 要通过动态SQL来解决
在动态SQL当中 我们将如何去遍历集合或数组
要通过一个动态SQL的标签foreach
3.3.4 功能开发
通过查看接口文档:删除员工
请求路径:/emps/{ids}
请求方式:DELETE
请求参数:路径参数 {ids}
响应数据:json格式
EmpController
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {@Autowired
private EmpService empService;//批量删除
@DeleteMapping("/{ids}")
public Result delete(@PathVariable List<Integer> ids){
empService.delete(ids);
return Result.success();
}//条件分页查询
@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) {
//记录日志
log.info("分页查询,参数:{},{},{},{},{},{}", page, pageSize,name, gender, begin, end);
//调用业务层分页查询功能
PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);
//响应
return Result.success(pageBean);
}
}
EmpService
public interface EmpService {
/**
* 批量删除操作
* @param ids id集合
*/
void delete(List<Integer> ids);//省略...
}
EmpServiceImpl
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;@Override
public void delete(List<Integer> ids) {
empMapper.delete(ids);
}//省略...
}
EmpMapper
@Mapper
public interface EmpMapper {
//批量删除
void delete(List<Integer> ids);//省略...
}
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.itheima.mapper.EmpMapper"><!--批量删除员工-->
<select id="delete">
delete from emp where id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select><!-- 省略... -->
</mapper>
3.3.5 功能测试
功能开发完成后,重启项目工程,打开postman,发起DELETE请求:
控制台SQL语句:
3.3.6 前后端联调
打开浏览器,测试后端功能接口: