Skip to content
基础

一句话答案

#{} 是预编译参数(PreparedStatement,防 SQL 注入),${} 是字符串拼接(有注入风险),值用 #{} 结构用 ${}。

核心要点

#{}: PreparedStatement 占位符,会加引号,防 SQL 注入 ${}: 直接拼接字符串,不加引号,适合动态表名/列名/ORDER BY

规则: 值用 #{},结构(表名/列名/排序)用 ${} 但需白名单校验

追问与易错

追问方向:

  • ORDER BY 能用 #{} 吗?
  • ${} 怎么防注入?
  • #{} 底层怎么实现?

易错点:

  • ❌ 所有地方都用 #{}——表名列名排序必须用 ${}
  • ❌ ${} 只有安全问题——还有引号处理问题

💡 记忆锚点

#{} = 带套(PreparedStatement预编译,安全防注入),${} = 裸奔(字符串直接拼接,有注入风险)。口诀:值用井号带套,结构(表名/列名/ORDER BY)用美元但必须白名单校验。