spring boot--08

一、<foreach> 标签:批量操作神器

1. 核心作用

用于遍历集合,批量生成 SQL 片段,最常见的场景是批量删除(IN语句)、批量插入。

2. 批量删除示例

业务场景:员工列表的批量删除

sql

复制代码
-- 原生SQL
delete from emp where id in (1,2,3);
1)Mapper 接口方法

java

运行

复制代码
// 批量删除方法,接收id列表
public void deleteByIds(List<Integer> ids);
2)XML 映射文件

xml

复制代码
<delete id="deleteByIds">
    delete from emp where id in
    <foreach collection="ids" item="id" separator="," open="(" close=")">
        #{id}
    </foreach>
</delete>

3. 标签属性详解

表格

属性 说明
collection 要遍历的集合参数名,这里对应接口方法的参数ids
item 遍历集合时,每个元素的别名(这里用id代表列表中的单个 ID)
separator 元素之间的分隔符,这里用逗号分隔,生成1,2,3
open 遍历开始前拼接的片段,这里是(,和IN语句的括号对应
close 遍历结束后拼接的片段,这里是),闭合IN语句的括号

二、<sql> 与 <include> 标签:SQL 片段复用

1. 核心作用

  • <sql>:定义可重复使用的 SQL 片段,避免代码冗余;
  • <include>:通过refid引用定义好的 SQL 片段。

2. 代码示例

1)定义可复用 SQL 片段

xml

复制代码
<!-- 定义通用的查询字段片段 -->
<sql id="commonSelect">
    select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time 
    from emp
</sql>
2)在多个查询中引用

xml

复制代码
<!-- 条件查询 -->
<select id="list" resultType="com.itheima.pojo.Emp">
    <include refid="commonSelect"/>
    <where>
        <if test="name != null">name like concat('%', #{name}, '%')</if>
        <if test="gender != null">and gender = #{gender}</if>
        <if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if>
    </where>
    order by update_time desc
</select>

<!-- 根据ID查询 -->
<select id="getById" resultType="com.itheima.pojo.Emp">
    <include refid="commonSelect"/>
    where id = #{id}
</select>

三、注意事项与最佳实践

  1. <foreach>的collection参数:

    • 如果接口方法的参数是List类型,collection属性值可以写list或直接写参数名(如示例中的ids);
    • 如果是Array数组类型,collection属性值写array或参数名。
  2. 批量删除的性能建议:

    • 单次批量删除的数量不宜过大,避免生成过长的IN语句,影响数据库性能;
    • 超大规模批量删除建议分批次执行。
  3. <sql>片段复用:

    • 适合复用查询字段、表名等固定 SQL 片段,提升代码可维护性;
    • 片段内避免包含动态 SQL(如<if>),否则可能降低可读性。
相关推荐
xyouyuweizhu4 小时前
字节流与字符流:Java IO 的两条主线该怎么选
java·开发语言·python
迪菲赫尔曼4 小时前
【基础篇 04】第一次使用终端:命令在哪里输入,电脑现在又“站”在哪里?
python·yolo·目标检测
qianbo_insist4 小时前
# 在 Qwen3.5-2B 上把 GDN-1 无损换成 GDN-2:一次完整的架构手术实验(负结果)
人工智能·pytorch·python·架构
多弗朗皮卡丘4 小时前
C++的IO流
开发语言·c++·io流·文件io流
liyi_hz20084 小时前
O2OA(翱途) V10.1 即将发布|功能再升级,安全再加固,协同更高效!
java·javascript·windows·开源软件
骑着蜗牛撵大象3275 小时前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
itmigrate5 小时前
Rust 里的所有权误区:不是不写 clone 就叫高性能
开发语言·后端·rust
Brilliantwxx5 小时前
【Linux】 文件访问与路径解析:目录、文件名、dentry、路径缓冲与 dcache 全解析
linux·运维·服务器·开发语言·spring
摇滚侠5 小时前
《On Java 中文版 基础卷》阅读笔记 初始化和清理 08
java·开发语言·笔记
xiangyun615 小时前
C++ 手撕 shared_ptr:引用计数与控制块到底长什么样?
开发语言·c++·算法·面试·stl