外观
一句话答案
#{} 是预编译参数(PreparedStatement,防 SQL 注入),${} 是字符串拼接(有注入风险),值用 #{} 结构用 ${}。
核心要点
#{}: PreparedStatement 占位符,会加引号,防 SQL 注入 ${}: 直接拼接字符串,不加引号,适合动态表名/列名/ORDER BY
规则: 值用 #{},结构(表名/列名/排序)用 ${} 但需白名单校验
追问与易错
追问方向:
- ORDER BY 能用 #{} 吗?
- ${} 怎么防注入?
- #{} 底层怎么实现?
易错点:
- ❌ 所有地方都用 #{}——表名列名排序必须用 ${}
- ❌ ${} 只有安全问题——还有引号处理问题
💡 记忆锚点
#{} = 带套(PreparedStatement预编译,安全防注入),${} = 裸奔(字符串直接拼接,有注入风险)。口诀:值用井号带套,结构(表名/列名/ORDER BY)用美元但必须白名单校验。