当前位置: 首页 > 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.lryc.cn/news/577073.html

相关文章:

  • 【系统分析师】2021年真题:案例分析-答案及详解
  • CppCon 2017 学习:Type Punning in C++17 Avoiding Pun-defined Behavior
  • 【硬核数学】2.4 驯服“梯度下降”:深度学习中的优化艺术与正则化技巧《从零构建机器学习、深度学习到LLM的数学认知》
  • Python爬虫:Requests与Beautiful Soup库详解
  • ISP Pipeline(9):Noise Filter for Chroma 色度去噪
  • node js入门,包含express,npm管理
  • 用户行为序列建模(篇八)-【阿里】DIEN
  • ROS常用的路径规划算法介绍
  • 在Linux系统中部署Java项目
  • 爪形行列式
  • 图书管理系统练习项目源码-前后端分离-使用node.js来做后端开发
  • Linux中ssh无法使用配置的环境变量,ssh(非登录环境)环境变量和登录环境变量不同步问题
  • python中多线程:线程插队方法join详解、线程停止、通过变量来让线程停止
  • 电子计数跳绳原型
  • StarRocks 3.5 新特性解读:Snapshot 快照恢复、大导入性能全面升级、分区管理更智能
  • 左神算法之螺旋打印
  • vue使用Element Plus UI框架
  • Modbus 报文结构与 CRC 校验实战指南(一)
  • 设计模式(五)
  • Java面试宝典:基础五
  • pyhton基础【18】面向对象基础一
  • LRU缓存设计与实现详解
  • XWPFDocument导出word文件
  • 使用component封装组件和h函数的用法
  • 71. 简化路径 —day94
  • Utils系列之内存池(Fixed size)
  • Elasticsearch 集群升级实战指引—7.x 升级到 8.x
  • 【C++】C++中的友元函数和友元类
  • Prompt Depth Anything:以提示方式驱动的Depth Anything用于实现4K分辨率下的精确米制深度估计
  • 大事件项目记录12-文章管理接口开发-总