#{}和${}的区别

本文探讨了在数据库操作中,使用#{}

#表示占位符, 相当于JDBC中的?, 底层工作的是PreparedStetement对象, SQL只编译一次, 而且没有SQL注入问题
#当传入的参数为一个简单类型时, #{}可以随便写
$ 表示字符串拼接, 底层工作的是Statement对象, 每次都会重新编译, 而且存在 SQL 注入问题
$ 当传入的参数为一个简单类型时, ${}只能写value

<think>好的,用户想了解Java#$符号的区别。首先,我需要回忆相关的知识,并查看提供的引用资料。根据引用[1],Java中的#号用于注释,包括单行多行注释,而$符号在Java中可能不是原生用途。不过引用[2]、[3]、[5]提到了MyBatis中#$区别,这与SQL相关,可能用户混淆了Java本身框架中的用法。另外,引用[4]提到C语言中的###,但用户的问题是关于Java的,所以可能需要区分清楚。 首先,确定Java原生的#$用法。根据引用[1],#Java中用于注释,但实际Java的单行注释是//,多行是/* */,可能引用[1]有误,或者用户可能指的是其他上下文,比如注解处理器或框架中的符号。需要澄清这一点。例如,Java注解中有#,但用户可能指的是MyBatis中的用法,这属于框架层面。 接着,用户可能看到MyBatis中的#{}${},如引用[3][5]所述,这里需要解释在MyBatis中两者的区别,比如预编译字符串替换,防止SQL注入等。但用户的问题是Java中的符号,所以需要明确区分Java语言本身框架中的用法。 可能需要指出,在Java语言中,#主要用于注释(虽然实际是//),而$在标识符中允许使用,但通常不推荐。而在MyBatis等框架中,#$有不同的含义,用于SQL动态拼接,此需详细说明两者的区别,如预编译拼接,安全风险等。 总结:用户可能将Java本身的符号与框架中的符号混淆,需要分别说明。在Java中,#不是注释符号,可能引用[1]有误,而$可用于变量名但很少用。而在MyBatis中,#{}${}用于SQL参数处理,区别在于预编译字符串替换,涉及安全性。</think>### Java#$符号的用法与区别Java语言及其相关框架中,`#``$`符号的用途有显著差异,具体可分为以下两类: --- #### **一、Java语言原生用途** 1. **`#`符号** - **注释功能**:在Java中,`#`符号**并非原生注释符号**。单行注释使用`//`,多行注释使用`/* ... */`。引用[1]中提到的“#表示注释”可能是对特定框架(如属性文件或模板引擎)的误解[^1]。 - **特殊场景**:在注解处理器或Javadoc标签中,`#`可能用于引用类成员(例如`ClassName#methodName`),但这是约定而非语法规则。 2. **`$`符号** - **合法标识符**:`$`允许用于变量名或方法名(如`String my$Var;`),但通常不推荐使用,因其常见于编译器生成的代码(如匿名类)[^1]。 - **模板引擎或框架**:在部分模板引擎(如FreeMarker)中,`$`可能用于变量插值,但这属于框架特性,非Java原生语法。 --- #### **二、MyBatis框架中的用途(核心区别)** 在MyBatis动态SQL中,`#{}``${}`用于参数替换,但实现方式安全性差异显著: 1. **`#{}`符号** - **预编译占位符**:将参数替换为`?`,通过JDBC预编译防止SQL注入。例如: ```sql SELECT * FROM users WHERE id = #{userId} ``` 解析为`SELECT * FROM users WHERE id = ?`,参数值自动转义[^3][^5]。 - **数据类型处理**:字符串类型自动添加引号,其他类型按原值处理。 2. **`${}`符号** - **字符串直接拼接**:直接将参数值替换到SQL中,无预编译机制。例如: ```sql SELECT * FROM users ORDER BY ${columnName} ``` 若`columnName`为恶意输入`"id; DROP TABLE users"`,可能导致SQL注入[^2][^5]。 - **适用场景**:仅用于非用户输入的场景(如动态表名、排序字段)。 --- #### **三、对比总结** | 符号 | 原生Java用途 | MyBatis框架用途 | 安全性 | |--------|---------------------------|----------------------------------|-------------| | `#` | 无直接用途(非常规注释) | 预编译参数占位符,防止SQL注入 | 高 | | `$` | 合法但少用的标识符 | 字符串拼接,存在SQL注入风险 | 低 | --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值