温馨提示×

温馨提示×

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

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

Dynamic SQL怎么拼接条件

发布时间:2026-09-08 22:26:10 来源:亿速云 阅读:84 作者:小樊 栏目:数据库

MyBatis / JDBC / 通用后台开发 里,“Dynamic SQL 拼接条件”通常指根据前端传参动态决定是否拼接 WHERE 条件,避免写死 SQL。下面按常见场景给你总结。


一、MyBatis 中最常见(推荐)

1️⃣ <if> 条件拼接

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

✅ 优点:清晰、安全(防止 SQL 注入)


2️⃣ <where> 自动处理 AND / OR

<select id="queryUser" resultType="User">
  SELECT * FROM user
  <where>
    <if test="name != null">
      AND name = #{name}
    </if>
    <if test="age != null">
      AND age = #{age}
    </if>
  </where>
</select>

<where> 会自动:

  • 去掉开头的 AND
  • 没有条件时不拼 WHERE

3️⃣ <choose>(类似 if-else)

<where>
  <choose>
    <when test="type == 'A'">
      AND type = 'A'
    </when>
    <when test="type == 'B'">
      AND type = 'B'
    </when>
    <otherwise>
      AND status = 1
    </otherwise>
  </choose>
</where>

4️⃣ <foreach> 拼接 IN 条件

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

二、Java 字符串拼接(不推荐)

StringBuilder sql = new StringBuilder("SELECT * FROM user WHERE 1=1");
if (name != null) {
    sql.append(" AND name = '").append(name).append("'");
}

❌ 风险:SQL 注入
✅ 如果必须拼,一定要用 PreparedStatement


三、MyBatis-Plus(更省事)

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like(name != null, "name", name);
wrapper.eq(age != null, "age", age);

四、常见坑总结

问题 解决
条件前有 AND 报错 <where>
参数为空也拼条件 != null
IN 条件为空 先判断 size() > 0
SQL 注入 永远用 #{} 不用 ${}

如果你能告诉我:

  • 用的是 MyBatis / JPA / MyBatis-Plus / 原生 JDBC
  • 单表查询还是复杂 SQL

我可以直接帮你写一份可用的 SQL 模板。

向AI问一下细节

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

AI