MyBatis批量删除
一、应用场景
批量删除常用于:
- 在列表页面勾选多个数据,点击“删除”按钮,一次性删除多条记录。
- 后台管理系统、数据清理等场景。
二、实现思路
- 前端:将选中的多个id(如[1,2,3])通过请求发送到后端。
- 后端Controller/Service:接收id数组,调用Mapper方法。
- Mapper接口:定义批量删除方法,参数为数组或集合。
- Mapper.xml:用<foreach>标签动态拼接SQL的in条件,实现批量删除。
三、详细步骤
1. Mapper接口定义
- 方法名:deleteByIds
- 参数类型:int[]、List<Integer>等
- 参数注解:@Param("ids"),方便在XML中引用
示例:
void deleteByIds(@Param("ids") int[] ids);
或
void deleteByIds(@Param("ids") List<Integer> ids);
2. SQL映射文件(XML)
传统写法(不推荐,参数个数固定):
<delete id="deleteByIds">delete from tb_brandwhere id in (?,?,?)
</delete>
缺点:只能删除3个,不能动态扩展。
推荐写法(动态拼接):
<delete id="deleteByIds">delete from tb_brandwhere id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
</delete>
- collection="ids":要和@Param("ids")一致
- item="id":每次循环的变量名
- separator=",":每个id之间用逗号分隔
- open="(" close=")":拼接成SQL的括号
最终效果:
delete from tb_brand where id in (1,2,3)
3. 执行方法与测试
- 前端传递:[1,2,3]
- 后端调用:deleteByIds(new int[]{1,2,3});
- MyBatis自动将数组展开,拼接成SQL,批量删除。
四、常见问题与解决
1.参数名不一致
@Param("ids")和foreach的collection="ids"必须一致,否则报错。
2.open/close/ separator漏写
漏写会导致SQL语法错误,如in 1,2,3,应为in (1,2,3)。
3.参数类型不匹配
int[]、List<Integer>、Integer[]都可以,但要和XML一致。
4.SQL注入风险
foreach自动处理参数,不会有注入风险,不要手动拼接字符串。
五、完整代码示例
Mapper接口
public interface BrandMapper {void deleteByIds(@Param("ids") int[] ids);
}
Mapper.xml
<delete id="deleteByIds">delete from tb_brandwhere id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
</delete>
Service层调用
brandMapper.deleteByIds(new int[]{1,2,3});
六、总结口诀
> foreach拼接in,参数用数组,
> open close separator,SQL不出错。