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

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,满足复杂的业务需求。


http://www.kler.cn/a/559884.html

相关文章:

  • 基于图扑 HT 可视化实现智慧地下采矿可视化
  • 如何在Jenkins上查看Junit报告
  • 91.在 Vue 3 中使用 OpenLayers 非 4326、3857 的投影示例
  • Unity 3D模型边缘锯齿严重
  • 性能巅峰对决:Rust vs C++ —— 速度、安全与权衡的艺术
  • Python----PyQt开发(PyQt高级:手搓一个音乐播放器)
  • 《论多源数据集成及应用》审题技巧 - 系统架构设计师
  • 【报错解决】vue打开界面报错Uncaught SecurityError: Failed to construct ‘WebSocket‘
  • Leetcode2209:用地毯覆盖后的最少白色砖块
  • 谷粒商城学习笔记-13-配置git-ssh-配置代码免密提交
  • 【JavaEE进阶】Spring MVC(2)
  • 从 JS 到 Dart:语法基础
  • DNS实验(ENSP模拟器实现)
  • 什么AGI
  • 软件工程中涉及的多种图表
  • 关于在mac中配置Java系统环境变量
  • 美颜相机1.0
  • Go语言--语法基础1
  • 数据结构与算法设计-作业4-excel表合并与数据整理
  • Go 语言中的协程