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

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.lqws.cn/news/567613.html

相关文章:

  • [论文阅读]MISSRce
  • Elasticsearch 索引设计与性能优化实战指南
  • M1芯片最终oracle成功版本拉取方法及配置
  • 二叉树找到下一个中序遍历节点的思路
  • foreach、for in 和for of的区别
  • VMware报错问题解决记录
  • NAND Flash BCH和FTL
  • 聊聊横向移动中的实际技术点 ----- ResponderSMB
  • FastAPI+Sqlite+HTML的登录注册与文件上传系统:完整实现指南
  • 驱动开发系列58 - 揭开内核IRQ框架的神秘面纱
  • 对基尼指数作出的努力
  • jenkins启动报错,一直无法启动
  • 介绍Windows下的由Sysinternals开发的一些小工具
  • 实战篇----利用 LangChain 和 BERT 用于命名实体识别-----完整代码
  • OpenAI 系列大模型发展时间轴与主要特性
  • 用Flink打造实时数仓:生产环境中的“坑”与“解药”
  • Mac homebrew 安装教程
  • linux系统---Nginx反向代理与缓存功能
  • Springboot 集成 SpringState 状态机
  • 代码随想录打卡第一天
  • C语言中常见字符串处理函数
  • 量子算法入门——5.Qiskit库介绍与简单应用(2)
  • Ubuntu服务器(公网)- Ubuntu客户端(内网)的FRP内网穿透配置教程
  • 博图SCL编程利器:CASE OF 语句详解与应用指南之设备运行模式选择框架
  • 领域驱动设计(DDD)【28】之实践或推广DDD的学习
  • docker compose基本使用以及示例
  • 基于springboot+vue的数字科技风险报告管理系统
  • URL带有中文会引入哪些问题
  • http相关网络问题面试怎么答
  • 算法-基础算法-递归算法(Python)