MyBatis 3 的批量删除

本文详细介绍了如何在MyBatis中使用<foreach>元素进行批量操作,包括批量删除记录的SQL编写及调用方法,以及如何通过List或数组传递参数。

    目前项目组持久层用的是 MyBatis 3(v 3.0.4),很多页面涉及到批量删除,查阅了一下myBatis 官方文档,文当中提到需要在MyBatis 的实体配置文件中配置一个元素,<foreach></foreach>  就是该元素。下面给出文档中关于该元素的介绍:

 

    另外一个动态SQL通用的必要操作是迭代一个集合,通常是构建在IN条件中的。比如:

<select id="selectPostIn" resultType="domain.blog.Post">

SELECT  *  FROM POST P  WHERE ID in

<foreach item="item" index="index" collection="list"

open="(" separator="," close=")">

#{item}

</foreach>

</select>

     foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。

注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。

 

 

     以下为是我写的Sql,仅供参考:

 

<!-- 通过主键集合批量删除记录 -->

<delete id="batchRemoveUserByPks" parameterType="java.util.List">

DELETE FROM LD_USER WHERE ID in 

<foreach item="item" index="index" collection="list" open="(" separator="," close=")">

#{item}

</foreach>

</delete>

 

     <delete> 元素的及其属性此处就不罗嗦了。下面说说<foreach>元素,该元素的 item="item" index="index" collection="list" ,上述的这三个属性我都没做任何修改,直接放在此处使用,包括  open="("  、 separator=","  、  close=")" 这个三个元素也是未做任何修改,需求刚好跟此吻合。每个属性的名字起的非常好,基本上一看就明白什么意思。唯一需要强调的是<foreach>元素中的  #{item},该处应该必须是跟元素中的这个  item="item" 属性一致,这个属性的name 应该是可以自定义的,还没看MyBatis 的源码,此处就不多说了。有兴趣的话可以自己做个Demo 看看。下面的是调用方法的代码片段

 

       List<String> idList = new ArrayList<String>();

 

       idList.add(1);

       idList.add(2);

       idList.add(3);

 

       userDao.delete("batchRemoveUserByPks",idList);

 

 

    至此,一个批量删除就搞定了。关于文档中提到的可以直接传过来一个数组,我木有用到过,有兴趣的可以自己些个小Demo 实验一下。虽然第一次用MyBatis,不过感觉用着还是比较舒服的,非常灵活的配置,除了写Sql 麻烦点外(其实完全可以选择用一些工具生成相关SQL文件,当然多多少少还是需要修改的),但这也是MyBatis 的特色,毕竟灵活就意味着自己得更多的手动!吐舌头

 

 

 

 

MyBatis批量删除操作本质上是通过 SQL 语句的 `IN` 子句来实现的,其底层机制依赖于 JDBC 的批处理能力,同时结合了 MyBatis 自身对 SQL 语句的动态生成与执行流程的管理。批量删除通常用于一次性删除多个符合条件的数据记录,通过传入一个包含多个主键值的集合,构建出类似 `DELETE FROM table_name WHERE id IN (value1, value2, ...)` 的 SQL 语句来完成操作。 在 MyBatis 中,批量删除的实现可以通过 XML 映射文件或注解方式定义 SQL,其中使用 `<foreach>` 标签或 `@Param` 注解来动态生成 `IN` 子句中的参数列表。例如,以下是一个典型的 XML 配置方式实现批量删除的示例: ```xml <delete id="deleteByIds"> DELETE FROM users WHERE id IN <foreach collection="ids" item="id" open="(" separator="," close=")"> #{id} </foreach> </delete> ``` 在执行该语句时,MyBatis 会将传入的 `ids` 集合(如 List 或数组)展开为多个 `#{id}` 占位符,并在底层通过 JDBC 的 `PreparedStatement` 设置每个参数的值,最终发送到数据库执行。这种方式避免了多次单条删除操作所带来的网络开销和数据库调用次数,从而提升了性能。 此外,MyBatis 支持与数据库事务的集成,批量删除操作可以在一个事务中完成,确保数据一致性。如果删除操作涉及大量数据,建议结合分页或分批次处理机制,以避免单次操作造成数据库压力过大或事务日志过长的问题。 在底层,MyBatis 会调用 `SqlSession` 的执行方法,如 `delete()` 或 `update()`,这些方法最终会委托给 `Executor` 接口的实现类来执行 SQL。如果启用了缓存机制(如一级缓存或二级缓存),在执行删除操作后,MyBatis 会自动清除相关的缓存数据,以确保后续查询获取的是最新的数据库状态[^3]。 ### 批量删除的优化建议 - 使用 `<foreach>` 标签时,注意数据库对 `IN` 子句中参数数量的限制(如 Oracle 的 `IN` 子句最多支持 1000 个元素)。 - 对于大规模数据删除,建议使用分页机制或数据库提供的批量删除接口(如 MySQL 的 `LIMIT` 子句)。 - 在事务中执行批量删除,以确保操作的原子性和一致性。 - 若使用 MyBatis-Plus,可以直接调用 `deleteBatchIds()` 方法实现基于主键的批量删除,简化开发流程[^2]。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值