温馨提示×

温馨提示×

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

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

怎样重构动态SQL代码

发布时间:2026-09-29 10:48:33 来源:亿速云 阅读:98 作者:小樊 栏目:数据库

重构动态 SQL(Dynamic SQL)的核心目标是:减少拼接错误、提升可读性、增强可维护性、防止 SQL 注入、方便测试。下面按「常见痛点 → 重构策略 → 示例」来说明。


一、常见的动态 SQL 问题

  1. 字符串拼接严重
"SELECT * FROM user WHERE 1=1 "
+ (name != null ? " AND name='" + name + "'" : "")

问题:易错、易注入、难维护。

  1. 条件分支嵌套深
  2. SQL 与业务逻辑耦合
  3. 难以单测
  4. 数据库方言混用

二、重构策略(按成熟度递进)

1️⃣ 使用「参数化查询」取代字符串拼接(必须)

✅ 防止 SQL 注入
✅ 数据库可缓存执行计划

Before

String sql = "SELECT * FROM user WHERE name = '" + name + "'";

After

String sql = "SELECT * FROM user WHERE name = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, name);

2️⃣ 使用条件构造器(最常用)

Java 示例(MyBatis / JPA / QueryDSL)

MyBatis 动态 SQL

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

✅ 优点:SQL 清晰、条件可组合


3️⃣ 使用 Builder 模式封装动态 SQL

适合 复杂查询 / 多表 Join

UserQuery query = UserQuery.builder()
    .name("Tom")
    .age(20)
    .build();

String sql = query.toSql();

Builder 内部:

  • 校验参数
  • 拼 WHERE
  • 参数化

4️⃣ 使用 ORM / DSL(推荐中大型系统)

JPA Specification

Specification<User> spec = (root, query, cb) ->
    cb.equal(root.get("name"), name);

QueryDSL

QUser user = QUser.user;
queryFactory.selectFrom(user)
    .where(user.name.eq(name))
    .fetch();

✅ 编译期检查
✅ 可复用
✅ 易测试


5️⃣ 抽离 SQL 与业务(分层)

推荐结构:

Controller
  ↓
Service
  ↓
Repository / Mapper
  ↓
SQL(XML / DSL)

❌ 不要在 Service 里拼 SQL
✅ SQL 只关心“数据怎么查”


6️⃣ 拆分“静态 SQL + 动态条件”

-- 固定部分
SELECT u.id, u.name
FROM user u
-- 动态部分
WHERE 1=1
  ${dynamicConditions}

或更好方式:

  • 固定 SQL 模板
  • 动态只生成 WHERE / ORDER

三、重构 checklist

✅ 是否全部参数化
✅ 是否有明显字符串拼接
✅ 是否能单测
✅ 是否可复用
✅ 是否数据库无关
✅ 新人能否看懂


四、示例对比总结

维度 旧写法 重构后
安全性 ❌ ✅
可读性 ❌ ✅
可维护性 ❌ ✅
测试性 ❌ ✅

如果你愿意,可以:

  • 贴一段你现在的动态 SQL 代码
  • 说明语言 / 框架(Java、MyBatis、Spring、Node 等)

我可以帮你直接重构成可落地的版本。

向AI问一下细节

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

AI
助
手