- 发布日期
员工管理:批量删除、动态SQL与事务
- 作者
- 姓名
- 缘
- 社交账号
文章目录
批量删除员工
员工删除同时支持单条删除和批量删除。单条删除可以看作只有一个 ID 的批量删除,因此统一设计一个接口即可。
DELETE /emps?ids=1,2,3
Controller接收多个ID
方式一:数组。
@DeleteMapping
public Result delete(Integer[] ids) {
log.info("根据id批量删除员工:{} ", ids);
return Result.success();
}
方式二:集合。
@DeleteMapping
public Result delete(@RequestParam List<Integer> ids) {
log.info("根据id批量删除员工:{} ", ids);
return Result.success();
}
课程后续 Service 使用 List<Integer> 处理批量 ID。
删除员工涉及两张表
员工数据包括:
emp → 员工基本信息
emp_expr → 员工工作经历
所以完整删除流程:
删除emp中的员工
↓
删除emp_expr中的工作经历
Service与事务
@Transactional(rollbackFor = {Exception.class})
public void deleteByIds(List<Integer> ids) {
empMapper.deleteByIds(ids);
empExprMapper.deleteByEmpIds(ids);
}
两个删除操作必须保持一致:
全部成功
或者
全部失败
因此使用 @Transactional 保证出现异常时回滚。
MyBatis foreach
批量删除最终需要生成:
delete from emp where id in (?, ?, ?);
ID 个数是动态的,所以使用 XML 动态 SQL。
<delete id="deleteByIds">
delete from emp
where id in
<foreach
collection="ids"
item="id"
separator=","
open="("
close=")"
>
#{id}
</foreach>
</delete>
foreach 主要属性:
collection:要遍历的集合。item:当前元素。separator:元素间分隔符。open:整体开始字符。close:整体结束字符。
工作经历删除同理:
<delete id="deleteByEmpIds">
delete from emp_expr
where emp_id in
<foreach
collection="empIds"
item="empId"
separator=","
open="("
close=")"
>
#{empId}
</foreach>
</delete>
完整调用链
DELETE /emps?ids=1,2,3
↓
EmpController
↓
EmpService
↓
@Transactional
↙ ↘
EmpMapper EmpExprMapper
↓ ↓
delete emp delete emp_expr
这一个功能把集合参数、MyBatis 动态 SQL 和 Spring 事务串在了一起。