温馨提示×

温馨提示×

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

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

怎样简化动态SQL拼接

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

动态 SQL 拼接如果写得不好,很容易出现拼接字符串混乱、易出错、难维护、SQL 注入风险等问题。下面从思路 → 常见方案 → 示例几个层面,讲怎么“简化”。


一、核心思路(先记住这 3 点)

  1. 不要手写字符串拼接
  2. 条件只拼“必要部分”
  3. 让框架或工具帮你处理 WHERE / AND / 逗号

二、常见简化方式(按推荐程度)

✅ 方式一:使用 MyBatis(最常用、最推荐)

1️⃣ <if> + <where> 自动处理 AND

<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 1=1
  • 自动去掉多余 AND
  • 防止 SQL 注入

2️⃣ <choose> 替代 if-else

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

3️⃣ <foreach> 简化 IN 查询

AND id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
  #{id}
</foreach>

✅ 方式二:MyBatis 注解 + Provider(代码更干净)

@SelectProvider(type = UserSql.class, method = "query")
List<User> query(User user);
public class UserSql {
  public String query(User u) {
    return new SQL(){{
      SELECT("*");
      FROM("user");
      if (u.getName() != null) WHERE("name = #{name}");
      if (u.getAge() != null) WHERE("age = #{age}");
    }}.toString();
  }
}

✅ 适合:SQL 不复杂但想少写 XML


✅ 方式三:使用 QueryWrapper(MyBatis-Plus)

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

userMapper.selectList(qw);

✅ 优点:

  • 几乎不写 SQL
  • 条件为空自动忽略

✅ 方式四:JPA / Spring Data(彻底不用 SQL)

List<User> findByNameAndAge(String name, Integer age);

或:

Specification<User> spec = (root, q, cb) -> {
  List<Predicate> list = new ArrayList<>();
  if (name != null) list.add(cb.equal(root.get("name"), name));
  return cb.and(list.toArray(new Predicate[0]));
};

✅ 适合:简单业务、快速开发


三、❌ 不推荐的写法(反面教材)

String sql = "SELECT * FROM user WHERE 1=1 ";
if (name != null) sql += " AND name = '" + name + "'";

问题:

  • SQL 注入
  • 难维护
  • 易拼错

四、简化总结(一句话版)

动态 SQL 拼接的终极简化 = 条件判断交给框架,SQL 结构保持固定

如果你愿意,可以告诉我:

  • 用的是 MyBatis / JPA / JDBC
  • SQL 是 简单查询 / 报表 / 多表

我可以直接帮你写一版“最简实现”。

向AI问一下细节

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

AI
助
手