起因
近期在跟着黑马的视频学习SpringBoot。就在我开开心心敲完练习代码打开数据库时天塌了😅(数据库表的数据被一键清空了)
相关代码
EmpController.java
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
@Autowired
private EmpService empService;
/**
* 删除员工信息
*/
@DeleteMapping
public Result delete(@RequestParam List<Integer> ids) {
log.info("删除员工:{}", ids);
empService.deleteByIds(ids);
return Result.success();
}
}
EmpService.java
public interface EmpService {
void deleteByIds(List<Integer> ids);
}
EmpServiceImpl.java:
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private EmpMapper empMapper;
@Autowired
private EmpExprMapper empExprMapper;
/**
* 批量删除员工
*/
@Override
public void deleteByIds(List<Integer> ids) {
// 1. 删除员工基本信息
empMapper.deleteByIds(ids);
// 2. 删除员工工作经历信息
empExprMapper.deleteByEmpIds(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="cn.iamdt.mapper.EmpMapper">
<!--通过ID批量删除员工-->
<delete id="deleteByIds">
delete from emp where id in <foreach collection="ids" item="id" separator="," open="(" close=")">
id </foreach>
</delete>
</mapper>
问题分析
经过不是很严谨的分析,可以很轻易地想到是跟数据库删除操作有关。结合代码没有报错,且SQL语句成功执行判断,问题是出在SQL语句上面。
接口请求成功
日志显示删除了30条数据
一番思索之后,我找到了问题所在…
让我们仔细看看这个SQL语句
<delete id="deleteByIds">
delete from emp where id in
<foreach collection="ids" item="id" separator=","
open="(" close=")">
id </foreach>
</delete>
没错,这里应该使用#{}来包装变量,而我忘记了。造成出现id=id这种尴尬情况。到这里,问题也已经解决了。
总结
原代码的问题在于<foreach>
中直接写了id
,而不是使用#{id}
来动态引用变量值。修正后,代码可以正常工作并生成正确的SQL语句。
这也提醒我开发环境和生产环境必须分离,避免出现呆瓜问题🤣