缘博客
发布日期

员工管理:批量删除、动态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 事务串在了一起。