当前位置: 首页 > ops >正文

MyBatis批量删除

一、应用场景

批量删除常用于:

  • 在列表页面勾选多个数据,点击“删除”按钮,一次性删除多条记录。
  • 后台管理系统、数据清理等场景。

二、实现思路

  1. 前端:将选中的多个id(如[1,2,3])通过请求发送到后端。
  1. 后端Controller/Service:接收id数组,调用Mapper方法。
  1. Mapper接口:定义批量删除方法,参数为数组或集合。
  1. 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不出错。

http://www.xdnf.cn/news/14710.html

相关文章:

  • 现代 JavaScript (ES6+) 入门到实战(一):告别 var!拥抱 let 与 const,彻底搞懂作用域
  • 数据结构笔记4:数组、链表OJ
  • 华为云 Flexus+DeepSeek 征文|华为云 Flexus 云服务 Dify-LLM 平台深度部署指南:从基础搭建到高可用实践
  • 疏通经脉: Bridge 联通逻辑层和渲染层
  • 使用component封装组件和h函数的用法
  • 数据结构之Map和Set
  • 打造地基: App拉起基础小程序容器
  • linux面试常考
  • 正交视图三维重建 笔记 2d线到3d线
  • 使用deepseek制作“喝什么奶茶”随机抽签小网页
  • Jina-Embeddings-V4:多模态向量模型的革命性突破与实战指南
  • Python生成器表达式最佳实践指南:何时使用与高效选择
  • Flutter基础(控制器)
  • Python基础(吃洋葱小游戏)
  • LINUX628 NFS 多web;主从dns;ntp;samba
  • WOE值:风险建模中的“证据权重”量化术——从似然比理论到FICO评分卡实践
  • SpringMVC系列(五)(响应实验以及Restful架构风格(上))
  • H6-108QB2W QILSTE/旗光
  • WebRTC(十二):DTLS
  • Cesium快速入门到精通系列教程十一:Cesium1.74中高性能渲染上万Polyline
  • 2025第十五届上海生物发酵展:江苏健达干燥盛装赴会
  • 数据结构:最小生成树—Prim(普里姆)与Kruskal(克鲁斯卡尔)算法
  • 使用asyncio构建高性能网络爬虫
  • Linux离线搭建Redis (centos7)详细操作步骤
  • Python助力自动驾驶:深度学习模型优化全攻略
  • Flutter基础(Riverpod)
  • 用AI给AR加“智慧”:揭秘增强现实智能互动的优化秘密
  • 【学习笔记】深入理解Java虚拟机学习笔记——第12章 Java内存模型与线程
  • RNN(循环神经网络)与LSTM(长短期记忆网络)输出的详细对比分析
  • 战神授权后台报错:Parse error: syntax error, unexpected end of file in解决办法