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>
相关推荐
炸薯条!几秒前
二叉树的链式表示(2)
java·数据结构·算法
右耳朵猫AI4 分钟前
Python周刊2026W22 | Django 6.1 Alpha 1发布、Nuitka 4.1发布、PEP 831终稿、PEP 808已接受
开发语言·python·django
半个烧饼不加肉6 分钟前
JS 底层探究-- 普通函数和构造函数
开发语言·javascript·原型模式
徐寿春12 分钟前
什么是数据倾斜
java·guava
小白不白11115 分钟前
C# WinForm 与 VP 二次开发
开发语言·c#
李白的天不白20 分钟前
一个服务器可以搭建多个网站
java·tomcat
●VON20 分钟前
AtomGit Flutter鸿蒙客户端:共享组件
java·flutter·华为·harmonyos·鸿蒙
程序猿乐锅21 分钟前
【JAVASE | 第十七篇】Java 网络通信
java·开发语言
执于代码23 分钟前
Java交互打印的问题
java
飞舞哲33 分钟前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab