我的Mybatis怎么把数据表清空了?

摘要: 本文介绍了关于Java、JavaEE、SpringBoot和Mybatis等技术栈在数据处理过程中的问题,主要聚焦于如何通过Mybatis清空数据表。首先,文章描述了EmpController.java和EmpService.java等文件的内容,包括删除操作的实现。然后,通过EmpServiceImpl.java和EmpMapper.xml的示例,说明了如何在Spring Boot应用中实现Mybatis的删除操作。文章还提到了在清空数据表过程中需要注意的SQL语句编写以及可能遇到的问题。最后,文章强调了学习和理解相关技术栈的重要性,特别是在处理数据库操作时要格外小心,以避免误操作导致的数据丢失。

起因

近期在跟着黑马的视频学习SpringBoot。就在我开开心心敲完练习代码打开数据库时天塌了😅(数据库表的数据被一键清空了)
ScreenShot_2025-03-29_10-29-23.png

相关代码

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语句上面。
接口请求成功
ScreenShot_2025-03-29_10-40-50.png
日志显示删除了30条数据
ScreenShot_2025-03-29_10-41-26.png
一番思索之后,我找到了问题所在…
让我们仔细看看这个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语句。
这也提醒我开发环境和生产环境必须分离,避免出现呆瓜问题🤣