SQL中,# 和 $ 用于不同的占位符语法

在 MyBatis 的 SQL 映射文件(如 .xml 文件)中,# 和 $ 用于不同的占位符语法,它们有以下区别:

#{} 占位符:

预编译处理:#{} 中的内容会被视为一个 JDBC 预编译语句的参数。MyBatis 会将其替换为 ?,并使用 PreparedStatement 来设置参数值。

防止 SQL 注入:由于使用了预编译语句,可以有效防止 SQL 注入攻击。

类型安全:MyBatis 会根据 Java 类型自动处理数据类型的转换。

示例:

XML 复制代码
 <select id="selectUsers" parameterType="int" resultType="hashmap">
      SELECT * FROM users WHERE id = #{userId}
 </select>

${} 占位符:

直接替换:${} 中的内容会被直接替换为变量的值,不会进行预编译处理。这相当于将变量值直接拼接到 SQL 字符串中。

存在 SQL 注入风险:由于是直接替换,如果输入未经严格校验,可能会导致 SQL 注入攻击。

灵活性:适用于一些动态 SQL 场景,例如表名或列名的动态替换。

示例:

XML 复制代码
<select id="selectUsersByTableName" resultType="hashmap">
      SELECT * FROM ${tableName}
</select>
相关推荐
曹牧3 分钟前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring
daixin88486 分钟前
cursor无法正常使用gpt5.5等模型解决方案
java·redis·cursor
小短腿的代码世界7 分钟前
Qt文件系统与IO深度解析:从QFile到异步文件操作
开发语言·qt
韦禾水1 小时前
记录一次项目部署到tomcat的异常
java·tomcat
曦月合一1 小时前
树莓派安装jdk、tomcat、vnc、谷歌浏览器开机自启等环境配置
java·tomcat·树莓派
harder3211 小时前
RMP模式的创新突破
开发语言·学习·ios·swift·策略模式
jinanwuhuaguo2 小时前
OpenClaw工程解剖——RAG、向量织构与“记忆宫殿”的索引拓扑学(第十三篇)
android·开发语言·人工智能·kotlin·拓扑学·openclaw
Rust研习社2 小时前
使用 Axum 构建高性能异步 Web 服务
开发语言·前端·网络·后端·http·rust
此剑之势丶愈斩愈烈2 小时前
openssl 自建证书
java
面汤放盐2 小时前
何时使用以及何时不应使用微服务:没有银弹
java·运维·云计算