你提供的这段代码是 MyBatis 的 Mapper XML 中的一个删除操作语句,核心需求是根据传入的多个job_log_id(日志ID)批量删除sys_job_log表中的定时任务日志记录。
代码完整解析与优化
首先,我先把这段代码补充完整并优化(补充必要的命名空间、注释等),让它可以直接在项目中使用:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- 需替换为你实际的Mapper接口全类名 --><mappernamespace="com.xxx.mapper.SysJobLogMapper"><!-- 根据多个日志ID批量删除定时任务日志 --><!-- parameterType:参数类型,这里传入的是Long类型的数组(array) collection:遍历的集合类型,数组用"array",List集合用"list" item:遍历过程中单个元素的别名 open/close:遍历结果的前后拼接符,这里拼接成 (id1,id2,id3) 格式 separator:元素之间的分隔符 --><deleteid="deleteJobLogByIds"parameterType="Long">DELETE FROM sys_job_log WHERE job_log_id IN<foreachcollection="array"item="jobLogId"open="("separator=","close=")">#{jobLogId}</foreach></delete></mapper>关键部分解释
标签与核心属性
<delete>:MyBatis 用于定义删除操作的标签,id需与 Mapper 接口中的方法名完全一致(如deleteJobLogByIds),parameterType声明传入参数的类型为Long(因为数组元素是 Long 类型)。DELETE FROM sys_job_log WHERE job_log_id IN:SQL 核心逻辑,通过IN关键字实现批量匹配删除。
标签(批量操作核心)
这是 MyBatis 实现批量操作的关键标签,作用是遍历传入的数组/集合,拼接成符合 SQL 语法的参数列表:collection="array":指定遍历的集合类型,如果传入的是数组,必须用 “array”;如果是 List 集合,需改为 “list”。item="jobLogId":遍历过程中单个元素的别名,后续通过#{jobLogId}取值(防止 SQL 注入)。open="("/close=")"/separator=",":分别指定遍历结果的前缀、后缀、元素分隔符,最终拼接成(1,2,3)格式。
对应的 Mapper 接口方法
要让这段 XML 生效,需在对应的 Mapper 接口中定义如下方法:importorg.apache.ibatis.annotations.Param;publicinterfaceSysJobLogMapper{/** * 批量删除定时任务日志 * @param jobLogIds 日志ID数组 */intdeleteJobLogByIds(Long[]jobLogIds);// 若传入的是List集合,方法需改为:// int deleteJobLogByIds(@Param("list") List<Long> jobLogIds);// 同时XML中collection需改为"list"}
总结
- 这段代码的核心是通过 MyBatis 的
<foreach>标签实现批量删除,避免循环单条删除导致的性能问题。 - 关键注意点:
collection的值需与传入参数类型匹配(数组用 “array”,List 用 “list”),且必须使用#{}取值防止 SQL 注入。 - 接口方法的参数类型需与 XML 中
parameterType及<foreach>遍历的元素类型一致,否则会报参数绑定异常。