MyBatis 中,#{} 和 ${}的区别

1. 底层处理机制不同

  • #{}(预编译占位符) :采用预处理的方式执行 SQL。它会将传入的参数替换为 ? 占位符,并在数据库端进行预编译。MyBatis 会根据参数的数据类型自动进行处理,比如字符串类型会自动加上单引号,数字类型则直接传入。
  • ${}(字符串直接替换):仅仅是在内存中进行纯粹的字符串拼接,直接将参数原样输出到 SQL 语句中,不会做任何类型的转换或自动添加引号。如果传入的是字符串且没有手动加单引号,就会因为不符合 SQL 语法而报错。

2.安全性不同(最关键的区别)

  • #{} :由于采用了预编译机制,参数值会被当作纯粹的"数据"而不是"SQL 指令"来解析,因此能够有效防止 SQL 注入攻击,安全性极高。
  • ${} :因为是直接拼接字符串,如果用户传入了恶意的 SQL 关键字(例如 OR 1=1),这些内容会被数据库当作合法的 SQL 指令执行,从而改变原始 SQL 的逻辑,存在极大的 SQL 注入风险。

3.使用场景不同

  • #{} :适用于绝大多数常规的数据传递场景,如 WHERE id = #{id}、INSERT INTO user(name) VALUES(#{name}) 等。
  • ${} :仅适用于需要动态生成 SQL 结构的特殊场景。比如你需要动态指定表名(SELECT * FROM ${tableName})、动态排序字段或方向(ORDER BY price ${sort})。因为这些是 SQL 命令或关键字,如果用 #{} 加上单引号变成了字符串,就会导致 SQL 语法错误。
相关推荐
大漠孤烟s6 天前
4.Mybatis学习-动态sql、缓存、逆向工程
mybatis
毕业设计7038 天前
(免费领源码) SpringBoot 游戏交易平台17600-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
java·spring boot·mysql·决策树·mybatis·idea·推荐算法
程序员JerrySUN8 天前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
linmengmeng_13148 天前
【总结】MyBatis-Plus批量插入与清表的正确姿势
java·spring boot·mysql·mybatis
vx_BS813308 天前
【项目编号:project51381】Spring Boot 婚纱摄影管理系统:套餐预约、在线咨询、支付与客片展示的一站式业务实现
java·spring boot·eclipse·tomcat·mybatis
jaysee-sjc10 天前
【苍穹外卖】Day01:从零认识企业级项目开发
java·开发语言·数据库·mysql·spring·intellij-idea·mybatis
程序猿乐锅10 天前
【黑马点评 | 第二篇】Redis 缓存更新策略与商铺缓存实现
java·网络·redis·spring·mybatis
萧瑟余晖10 天前
MyBatis 核心原理详解
架构·mybatis
MZA66610 天前
实战:基于 XXL-JOB + 策略模式 + Nacos 配置化的 CSV 导出任务系统设计
java·spring boot·mybatis
干到60岁退休的码农12 天前
15.创建获取用户接口与JWT认证器
java·spring boot·mybatis