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

Mybatis常用动态 SQL 相关标签

1. <if>

用于条件判断,当满足条件时执行对应的 SQL 片段。

示例:

<select id="findUser" resultType="User">
    SELECT * FROM users
    WHERE 1=1
    <if test="name != null and name != ''">
        AND name = #{name}
    </if>
    <if test="age != null and age != ''">
        AND age = #{age}
    </if>
</select>

 上述示例中,如果name不为null,并且不为空时,则拼接条件name进行查询。即if条件判断为true时,才进行name拼接查询


2. <where>

自动处理 WHERE 子句中的逻辑,避免手动拼接 ANDOR 导致的 SQL 错误。

  • 如果 <where> 内部没有任何内容,则不会生成 WHERE
  • 自动移除第一个条件前多余的 AND 或 OR

示例:

<select id="findUser" resultType="User">
    SELECT * FROM users
    <where>
        <if test="name != null and name != ''">
            AND name = #{name}
        </if>
        <if test="age != null and age != ''">
            AND age = #{age}
        </if>
    </where>
</select>

3. <set>

用于更新操作时动态生成 SET 子句,自动处理逗号分隔符。

  • 如果 <set> 内部没有任何内容,则不会生成 SET
  • 自动移除最后一个逗号。

示例:

<update id="updateUser">
    UPDATE users
    <set>
        <if test="name != null and name != ''">
            AND name = #{name}
        </if>
        <if test="age != null and age != ''">
            AND age = #{age}
        </if>
    </set>
    WHERE id = #{id}
</update>

4. <choose>、<when>、<otherwise>

类似于 Java 中的 switchif-else 语句,用于多条件分支判断。

示例:

<select id="findUser" resultType="User">
    SELECT * FROM users
    <where>
        <choose>
            <when test="name != null and name != ''">
                name = #{name}
            </when>
            <when test="email != null and email != ''">
                email = #{email}
            </when>
            <otherwise>
                age > 0
            </otherwise>
        </choose>
    </where>
</select>

上述示例中:

如果name不为空,则根据name查询

如果name不为空且email不为空,则根据email查询

如果name和email都为空,则查询age大于0的 


5. <trim>

用于自定义动态 SQL 的前缀和后缀,可以灵活控制生成的 SQL。

  • prefix:在SQL前添加内容。
  • suffix:在生成 SQL语句后添加内容。
  • prefixOverrides:移除指定的前缀(如多余的 AND 或 OR)。
  • suffixOverrides:移除指定的后缀。

示例:

<select id="findUser" resultType="User">
    SELECT * FROM users
    <trim prefix="WHERE" prefixOverrides="AND |OR">
        <if test="name != null and name != ''">
            AND name = #{name}
        </if>
        <if test="age != null and age != ''">
            AND age = #{age}
        </if>
    </trim>
</select>

6. <foreach>

用于遍历集合,常用于 IN 查询或批量插入。

  • collection:指定要遍历的集合名称。
  • item:集合中的每个元素的别名。
  • open:遍历开始的字符。
  • close:遍历结束的字符。
  • separator:集合项之间的分隔符。

示例:

<select id="findUsersByIds" resultType="User">
    SELECT * FROM users
    WHERE id IN
    <foreach collection="ids" item="id" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>

批量插入示例:

<insert id="batchInsert">
    INSERT INTO users (name, age)
    VALUES
    <foreach collection="list" item="user" separator=",">
        (#{user.name}, #{user.age})
    </foreach>
</insert>

7. <bind>

用于在 SQL 中创建变量,通常结合其他标签使用,比如正则表达式匹配。

示例:

<select id="findUserByLike" resultType="User">
    <bind name="pattern" value="'%' + _parameter + '%'" />
    SELECT * FROM users
    WHERE name LIKE #{pattern}
</select>

8. <sql> 和 <include>

用于定义可重用的 SQL 片段。

  • <sql>:定义 SQL 片段。
  • <include>:引用已定义的 SQL 片段。

示例:

<sql id="userColumns">
    id, name, age, email
</sql>

<select id="findUser" resultType="User">
    SELECT <include refid="userColumns" /> FROM users
    WHERE id = #{id}
</select>

总结

标签功能描述
<if>条件判断
<where>自动生成 WHERE 子句
<set>自动生成 SET 子句
<choose>多条件分支判断
<trim>自定义前缀和后缀
<foreach>遍历集合,适用于 IN 查询或批量操作
<bind>创建变量
<sql>定义可重用的 SQL 片段
<include>引用已定义的 SQL 片段

通过这些标签,MyBatis 可以灵活地生成动态 SQL,满足复杂的业务需求。

相关文章:

  • <692> 前K个高频单词
  • Windows、Mac、Linux,到底该怎么选?
  • 20250220-代码笔记01-class CVRPEnv
  • 画册封面设计有哪些要点呢?
  • 计算机单位之详解——存储单位Byte 网络传输单位bps 视频码率单位bps
  • 关于ES中text类型时间字段范围查询的结构化解决方案
  • 基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知
  • IC版图设计之DXF文件格式详解
  • 使用ezuikit-js封装一个对接摄像头的组件
  • node和vue的主流版本组合版本介绍
  • DeepSeek与AI幻觉
  • [寻找密码]
  • 游戏引擎学习第116天
  • Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
  • python字符串列表
  • ROS2学习
  • 25工程管理研究生复试面试问题汇总 工程管理专业知识问题很全! 工程管理复试全流程攻略 工程管理考研复试真题汇总
  • 深度学习图像预处理可视化:拆解Compose操作的全过程
  • Java并发编程面试题:ThreadLocal(8题)
  • VIM FZF 安裝和使用
  • 优秀“博主”在上海杨浦购房最高补贴200万元,有何条件?
  • 前4个月我国货物贸易进出口同比增长2.4%,增速较一季度加快1.1个百分点
  • 中美“第二阶段”贸易协定是否会在会谈中提出?商务部回应
  • 调节负面情绪可以缓解慢性疼痛
  • 两部门发布外汇领域行刑反向衔接案例,织密金融安全“防护网”
  • 宁波市人大常委会审议生育工作报告,委员建议学前教育免费