在 MyBatis 中,${} 和 #{} 是两种不同的参数占位符,用于在 SQL 语句中替换参数的值。
${}:
${}(美元符号占位符):
- ${} 是简单字符串替换,它会将参数原样替换到 SQL 语句中。
- 使用 ${} 时,要注意 SQL 注入的风险,因为参数值会直接替换到 SQL 语句中,可能造成安全问题。
- ${} 不会对参数进行预编译,可能导致 SQL 语句在数据库中被重复编译,性能稍低。
<!-- 使用 ${} 进行简单字符串替换 -->
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = ${userId}
</select>
该段代码使用 ${userId} 时,如果 userId 是字符串类型的参数,SQL 语句会被替换为 SELECT * FROM users WHERE id = ‘abc’。
#{}
#{}(井号符号占位符):
- #{} 是预编译的占位符,它会对参数进行安全处理,自动添加必要的转义字符,防止 SQL 注入。
- 使用 #{} 时,MyBatis 会将参数值作为预编译语句的参数传递给数据库,提高了 SQL 的执行效率和安全性。
- #{} 支持自动类型转换,例如将 Java 的 Date 类型转换为数据库的日期类型。
<!-- 使用 #{} 进行预编译占位 -->
<select id="getUserById" resultType="User">
SELECT * FROM users WHERE id = #{userId}
</select>
该段代码使用 #{userId} 时,如果 userId 是字符串类型的参数,MyBatis 会将 SQL 语句转换为 SELECT * FROM users WHERE id = ‘abc’,同时进行了安全处理。
总结
- #{}是预编译,用?作为占位符。${}是字符串替换,直接拼接
- Mybatis在处理#{}的时候,会将sql当中的#{}替换成?并且调用PreparedStatement来赋值
- #{}是自带引号的
- 由于${}是直接把传字符串,所以会有安全问题,比如在输入密码时输入:123 or 1=1,这样子就算密码不是123也能进去
补充
.在Spring框架中的配置文件可以使用"${}"引用配置属性,实现动态配置。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="url" value="${jdbc.url}" />
...
</bean>