mybatis #,$ 的区别
时间: 2024-04-13 21:26:25 浏览: 108
在MyBatis中,#{}和${}都是用来传递参数的。它们的区别在于#{}是预编译语句,可以防止SQL注入攻击,而${}是直接替换字符串,不能防止SQL注入攻击。因此,为了安全起见,建议使用#{}来传递参数。
具体来说,#{}会把传递进来的参数值替换成一个占位符,并且对占位符进行预编译处理,最终生成一个完整的SQL语句。而${}则直接把传递进来的参数值替换到SQL语句中,没有任何预编译处理。
举个例子,如果我们要传递一个字符串参数name到SQL语句中,可以这样写:
使用#{}:select * from user where name = #{name}
使用${}:select * from user where name = ${name}
如果传递的参数是"Tom' or 1=1 --",那么使用#{}传递参数可以安全地防止SQL注入攻击,而使用${}则会导致SQL注入攻击。因此,在实际开发中,应尽量避免使用${}来传递参数。
相关问题
Mybatis中$与#的区别, $的应用场景
#的区别是什么?
Mybatis中$和#都用于动态SQL语句中的参数绑定,但它们之间有几个区别:
1. #用于预编译,$用于值传递。#会将参数放入预编译语句中的占位符中,可以避免SQL注入,但会使SQL语句无法重用;$将参数直接拼接进SQL中,可以重用SQL语句,但有SQL注入的风险。
2. #可以自动进行类型转换,$不能自动转换。#会根据目标类型自动转换参数类型,$需要手动进行类型转换。
3. #可以在SQL中使用占位符,$不能使用。#可以在SQL语句中使用占位符进行模糊查询等操作,$只能直接拼接参数值。
因此,在使用Mybatis时,应根据具体的业务场景和需求选择使用#或$。
mybatis中$和#的区别
在MyBatis中,`$`和`#`是两个特殊的字符,它们在动态SQL生成中有重要的作用:
1. `$`: 这是MyBatis的传统方式(即JDBC预编译语句的遗留支持),在动态SQL表达式中用于引用参数的值。当你在mapper XML文件中直接写 `${parameterName}`,它会被替换为传入的参数值。例如:
```xml
<select id="selectUser" parameterType="map" resultType="User">
SELECT * FROM user WHERE name = #{name}
</select>
```
2. `#`: 这种形式是MyBatis 3.3及以上版本推荐使用的,特别是在Spring Boot集成时,它可以更好地避免SQL注入攻击,因为MyBatis会将`#{}`视为一个表达式,并通过EL(Expression Language)引擎去解析和安全地传递参数值。这种写法更安全且易于维护。同样地:
```xml
<select id="selectUser" parameterType="User" resultType="User">
SELECT * FROM user WHERE name = #{name}
</select>
```
在上述XML中,`#name`会被Spring EL引擎解析成对应的请求参数值。
总结来说,`$`在老版本中使用较多,而`#`不仅提供了更好的安全特性,还兼容了更多现代的依赖和框架。使用`#`时,参数的类型信息会保存在Mapper的参数映射中,有助于MyBatis性能优化。
阅读全文