mybatis中的动态sql标签

MyBatis 中的动态 SQL 标签提供了一种强大的方式来根据不同的条件动态生成 SQL 语句,增强了 SQL 语句的灵活性和可维护性。以下是一些主要的动态 SQL 标签的讲解:

<if>标签:

  • 用途:用于进行条件判断。如果满足指定的条件,就会将<if>标签内部的 SQL 片段添加到最终生成的 SQL 语句中。
  • 语法:<if test="条件表达式">SQL 片段</if>
  • 示例:
    <select id="selectUsers" resultType="User">
        SELECT * FROM users
        <if test="username!= null">
            WHERE username = #{username}
        </if>
    </select>

    在这个例子中,如果传入的参数username不为null,那么就会在生成的 SQL 语句中添加WHERE username = #{username}这个条件。

<choose><when><otherwise>标签组合:

  • 用途:类似于 Java 中的switch语句。可以根据不同的条件选择不同的 SQL 片段执行。
  • 语法:
    <select id="selectUsers" resultType="User">
        SELECT * FROM users
        <choose>
            <when test="condition1">SQL 片段 1</when>
            <when test="condition2">SQL 片段 2</when>
            <otherwise>默认 SQL 片段</otherwise>
        </choose>
    </select>

    示例:假设根据不同的角色来查询用户,若角色为 “admin” 则查询所有管理员用户,若角色为 “user” 则查询普通用户,否则查询所有用户。

    <select id="selectUsersByRole" resultType="User">
        SELECT * FROM users
        <choose>
            <when test="role == 'admin'">
                WHERE role = 'admin'
            </when>
            <when test="role == 'user'">
                WHERE role = 'user'
            </when>
            <otherwise>
                WHERE 1 = 1
            </otherwise>
        </choose>
    </select>

    <where>标签:

  • 用途:用于自动添加WHERE关键字,并处理条件中多余的ANDOR。如果<where>标签内部的条件都不满足,它会忽略整个WHERE子句。
  • 语法:<where>条件 SQL 片段</where>
  • 示例:
    <select id="selectUsersWithConditions" resultType="User">
        SELECT * FROM users
        <where>
            <if test="username!= null">
                AND username = #{username}
            </if>
            <if test="age > 0">
                AND age = #{age}
            </if>
        </where>
    </select>

    在这个例子中,如果传入的参数既没有username也没有指定age,那么最终生成的 SQL 语句中不会包含WHERE子句。 

<set>标签:

  • 用途:用于动态地构建UPDATE语句中的SET子句。它会自动处理多余的逗号,并在条件不满足时忽略整个SET子句。
  • 语法:<set>设置 SQL 片段</set>
  • 示例:
    <update id="updateUser" parameterType="User">
        UPDATE users
        <set>
            <if test="username!= null">
                username = #{username},
            </if>
            <if test="age > 0">
                age = #{age},
            </if>
        </set>
        WHERE id = #{id}
    </update>

    在这个例子中,如果传入的User对象的usernameage属性为null,那么在生成的UPDATE语句中就不会包含对应的设置项。

<foreach>标签:

  • 用途:用于循环遍历集合,并根据集合中的元素动态生成 SQL 片段。通常用于构建IN条件或批量插入、更新等操作。
  • 语法:<foreach collection="集合参数" item="元素变量名" separator="分隔符" open="开头字符" close="结尾字符">SQL 片段</foreach>
  • 示例:
    <select id="selectUsersByIds" resultType="User">
        SELECT * FROM users WHERE id IN
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </select>

    在这个例子中,如果传入一个包含多个用户 ID 的集合,<foreach>标签会动态生成一个IN条件的 SQL 片段。

<trim>标签:

  • 用途:可以自定义在 SQL 片段的开头和结尾添加或删除特定的字符。可以用于替代<where><set>标签在某些复杂场景下的使用。
  • 语法:<trim prefix="开头添加的字符" suffix="结尾添加的字符" prefixOverrides="开头删除的字符" suffixOverrides="结尾删除的字符">SQL 片段</trim>
  • 示例:
    <select id="selectUsersWithTrim" resultType="User">
        SELECT * FROM users
        <trim prefix="WHERE" suffix="" prefixOverrides="AND |OR">
            <if test="username!= null">
                AND username = #{username}
            </if>
            <if test="age > 0">
                OR age = #{age}
            </if>
        </trim>
    </select>

    在这个例子中,<trim>标签会根据条件动态添加WHERE关键字,并处理开头多余的ANDOR

这些动态 SQL 标签使得 MyBatis 在处理复杂的数据库查询和操作时更加灵活和强大,可以根据不同的条件动态生成合适的 SQL 语句,提高了代码的可维护性和可扩展性。 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小懒懒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值