Spring和MyBatis的#和$都是为了解决配置文件中的属性值问题而引入的。
在Spring中,$符号表示属性占位符,可以将属性文件中的属性值替换到Spring配置文件中的属性值中;而#{}符号则表示SpEL表达式占位符,可以通过表达式来计算属性值。
在MyBatis中,#符号表示参数占位符,可以防止SQL注入攻击;而$符号则表示文本替换符,直接将变量替换到SQL语句中,可能存在SQL注入风险。
共同点:
区别点:
Spring Expression Language(SpEL)是Spring框架中的一种表达式语言,可以在运行时计算表达式的值。它支持在Spring框架中访问和操作对象图,包括Spring bean和属性文件中的属性。
SpEL表达式可以通过以下方式使用:
其中最重要的SpEL表达式是引用对象和属性访问。
它们使得我们可以轻松地在Spring框架中访问和操作对象图,而不需要编写复杂的Java代码。
在MyBatis中使用#可以防止SQL注入攻击的原因是,#号会将传入的参数视为一个完整的值,并对这个值进行预编译处理,最终在将其绑定到SQL语句中时,会将其转换成一个占位符,然后再与SQL语句进行拼接。因此,无论传入的参数是什么,都不会对SQL语句造成影响。
举个例子:#{name}传入的是'admin' or 1=1',其最终会转换成什么传入SQL语句呢?
传入入的值为'admin' or 1=1'
,在使用#
时,MyBatis会将其转义为'admin\' or 1=1';
传入SQL语句后,数据库会将其视为一个普通的字符串,而不会将or 1=1
解析成一个条件语句。
因此,使用#
可以有效地防止SQL注入攻击。
在MyBatis中,尽量使用#解决配置文件中的属性值问题,因为其能防止恶意注入攻击;但对动态拼接SQL语句时,可能需要使用$
符号进行占位符替换。
在Spring中,$使用简单方便,而#可以进行更复杂的运算和处理。