温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

动态SQL怎么避免重复

发布时间:2026-07-14 09:47:13 来源:亿速云 阅读:93 作者:小樊 栏目:数据库

“动态 SQL 避免重复”一般有 两层含义,我会分别说明,并给出常见解决方案 + 示例,你可以对照自己的场景选用。


一、避免「SQL 语句片段重复拼接」(代码层面)

问题表现

if (cond1) {
    sql += " AND a = 1";
}
if (cond2) {
    sql += " AND a = 1"; // 重复
}

✅ 解决方案

1️⃣ 使用 MyBatis <sql> + <include>(最常用)

定义可复用 SQL 片段

<sql id="baseWhere">
    WHERE 1=1
</sql>

<sql id="condA">
    AND a = #{a}
</sql>

复用

<select id="query">
    SELECT * FROM t
    <include refid="baseWhere"/>
    <if test="a != null">
        <include refid="condA"/>
    </if>
</select>

✅ 避免:

  • 条件重复
  • 复制粘贴 SQL

2️⃣ 使用 MyBatis <where> / <trim> 自动处理重复

❌ 错误写法

WHERE 1=1
AND a = #{a}
AND b = #{b}

✅ 正确写法

<where>
    <if test="a != null">
        AND a = #{a}
    </if>
    <if test="b != null">
        AND b = #{b}
    </if>
</where>

✅ 好处:

  • 自动去掉多余 AND / OR
  • 避免重复拼接

3️⃣ 使用 MyBatis <foreach> 避免 IN 条件重复

❌ 重复拼接

AND id IN (1)
AND id IN (2)

✅ 正确

<if test="ids != null and ids.size() > 0">
    AND id IN
    <foreach collection="ids" item="id" open="(" close=")" separator=",">
        #{id}
    </foreach>
</if>

二、避免「查询结果重复」(数据层面)

1️⃣ 使用 DISTINCT

SELECT DISTINCT user_id FROM orders

⚠️ 注意:

  • DISTINCT 是对整行去重
  • 性能开销较大

2️⃣ 使用 GROUP BY

SELECT user_id, MAX(create_time)
FROM orders
GROUP BY user_id

✅ 适合:

  • 聚合统计
  • 取最新 / 最大 / 最小

3️⃣ 动态 SQL + 去重(常见组合)

<select id="query">
    SELECT
    <choose>
        <when test="distinct">
            DISTINCT *
        </when>
        <otherwise>
            *
        </otherwise>
    </choose>
    FROM t
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
    </where>
</select>

三、避免「动态条件重复生效」

问题

<if test="a != null">
    AND a = #{a}
</if>
<if test="a != null">
    AND a = #{a}
</if>

✅ 解决:

  • 抽成 <sql>
  • 或统一在 Service 层组装参数

四、设计层面建议(非常重要)

✅ 推荐做法

场景 建议
条件多 <where> + <if>
公共 SQL <sql> + <include>
IN 查询 <foreach>
去重 DISTINCT / GROUP BY
复杂动态 Query Object / Criteria

五、一句话总结

动态 SQL 避免重复 = SQL 片段复用 + 自动拼接 + 数据去重

如果你愿意,可以把你具体的 SQL 或 MyBatis XML贴出来,我可以直接帮你重构优化。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI