在mybatis中,${} 和 #{} 的区别是什么?
时间: 2023-06-10 12:04:58 浏览: 120
#{}有什么不同?
在MyBatis中,${}中的值是直接替换到SQL语句中的,相当于直接拼接字符串,容易受到SQL注入攻击,同时也无法避免类型转换问题。
而#{}中的值是使用预编译参数方式传入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性能优化。
Mybatis中$与#的区别, $的应用场景
#的区别是什么?
Mybatis中$和#都用于动态SQL语句中的参数绑定,但它们之间有几个区别:
1. #用于预编译,$用于值传递。#会将参数放入预编译语句中的占位符中,可以避免SQL注入,但会使SQL语句无法重用;$将参数直接拼接进SQL中,可以重用SQL语句,但有SQL注入的风险。
2. #可以自动进行类型转换,$不能自动转换。#会根据目标类型自动转换参数类型,$需要手动进行类型转换。
3. #可以在SQL中使用占位符,$不能使用。#可以在SQL语句中使用占位符进行模糊查询等操作,$只能直接拼接参数值。
因此,在使用Mybatis时,应根据具体的业务场景和需求选择使用#或$。
阅读全文