简短结论:动态 SQL 本身“能不能缓存”,取决于你说的“缓存”指的是哪一层、以及动态 SQL 的实现方式。总体原则是:SQL 文本可以缓存,但执行结果是否可缓存,要看参数和语义。
下面分层说明:
以 Java / MyBatis 为例:
<select id="list" parameterType="map">
SELECT * FROM user
<where>
<if test="name != null">
AND name = #{name}
</if>
</where>
</select>
SELECT * FROM user WHERE name = ?
✅ 可以复用 PreparedStatement,数据库可以缓存执行计划✅ 所以:动态 SQL 的“结构”是可缓存的
只要动态 SQL 最终生成的 SQL 结构稳定、参数用占位符:
SELECT * FROM user WHERE age > ? AND status = ?
❗ 关键:不要拼字符串参数
❌ 错误示例(无法缓存):
SELECT * FROM user WHERE age > 20
SELECT * FROM user WHERE age > 21
✅ 正确示例:
SELECT * FROM user WHERE age > ?
例如:
SELECT * FROM category WHERE type = ?
可缓存层:
NOW()、RAND()✅ 错,只要参数化,就能缓存
✅ 错,结构一致即可
✅ 错,反而:
动态 SQL 可以缓存,前提是:参数化、结构稳定、语义可复用。
如果你愿意,可以告诉我:
我可以给你更具体的方案和示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。