mybatis中${}和#{}的区别

先测试,再说结论

java 复制代码
userService.selectStudentByClssIds(10000, "'wzh' or 1=1");
java 复制代码
    List<StudentEntity> selectStudentByClssIds(@Param("stuId") int stuId, @Param("field") String field);
xml 复制代码
 <select id="selectStudentByClssIds" resultMap="StudentResultMap">
        SELECT
           student_id, name, age, gender
        FROM students where name = ${field}
    </select>

控制台sql执行日志

对比一下,如果是把${field}替换成#{filed}

再玩个更有趣的,如果我们某个sql查询字段需要通过入参确定,如下

xml 复制代码
<select id="selectStudentByClssIds" resultMap="StudentResultMap">
        SELECT
           student_id, #{field}, age, gender
        FROM students;
    </select>

我们的入参为name,测试结果如下

也就是说这个sql变成了SELECT student_id, 'wzh', age, gender FROM students;

我们把#{field}替换成${filed}再看一下

xml 复制代码
<select id="selectStudentByClssIds" resultMap="StudentResultMap">
        SELECT
           student_id, ${field}, age, gender
        FROM students;
    </select>

如下,恢复正常了

综上

在 MyBatis 中,#{} 和 ${} 是两种不同的占位符语法,用于处理 SQL 语句中的参数。它们的用途和效果各不相同,不可以混淆

#{} 用于将参数值作为预编译语句的参数。MyBatis 会将该参数值绑定到 SQL 语句中,并自动转换为 SQL 对应类型和进行转义,从而提高安全性,防止 SQL 注入。

{} 用于字符串替换,它直接将传入的参数值插入到 SQL 语句中。MyBatis 不会对使用 {} 的参数进行处理或转义。 使用 ${} 时,参数直接拼接到 SQL 语句中,因此,如果传入的参数是用户输入的值,没有经过适当的验证和清理,会导致 SQL 注入风险。当您需要动态生成 SQL 语句的部分,如表名、列名等结构时。此时参数不能是用户输入,如,动态指定表名或列名

sql 复制代码
SELECT * FROM ${tableName} WHERE id = #{id} 
相关推荐
灵魂猎手19 分钟前
3. MyBatis Executor:SQL 执行的核心引擎
java·后端·源码
Galaxy在掘金19 分钟前
从业8年,谈谈我认知的后端架构之路-1
java·架构
努力努力再努力wz1 小时前
【c++深入系列】:万字详解模版(下)
java·c++·redis
瓦特what?2 小时前
关于C++的#include的超超超详细讲解
java·开发语言·数据结构·c++·算法·信息可视化·数据挖掘
是乐谷3 小时前
阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)
java·人工智能·阿里云·面试·职场和发展·机器人·云计算
Java水解3 小时前
Java中的四种引用类型详解:强引用、软引用、弱引用和虚引用
java·后端
Demisse3 小时前
[Linux] Linux文件系统基本管理
linux·运维·服务器
lifallen3 小时前
JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue
java·开发语言·数据结构·算法
一叶飘零_sweeeet3 小时前
IDEA 插件 Trae AI 全攻略
java·人工智能·intellij-idea
BAOYUCompany3 小时前
暴雨服务器:以定制化满足算力需求多样化
运维·服务器