#{}
在preparedStatement中为sql语句设置参数值,在sql中表示一个占位符,即?
#{}可以接受简单类型值或者pojo属性值,在传输的是简单类型值,#{}中可以是value或者其他
<!-- 根据id查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{value}
</select>
<!-- 根据id查询用户信息 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
该方式可以防止sql注入
${}
理解成使用该方式是直接在sql语句上拼接字符串,而不是像上文的表示一个占位符,而且该方式无法防止sql注入,看个例子就懂
${}同样可以接受简单类型值或者pojo属性值,接受简单类型值时其中只能用value
<!-- 根据名称模糊查询用户信息 -->
<select id="selectUserByName" parameterType="string"
resultType="user">
select * from user where username like '%${value}%'
</select>
对比一下#{}
<!-- 根据名称模糊查询用户信息 -->
<select id="selectUserByName" parameterType="string"
resultType="user">
select * from user where username like #{value}
</select>
使用时
再比如 order by 排序,如果将排序方式(asc/desc)通过参数传入 sql,,应该写为: ORDER BY columnName ${value} 如果使用#{}将无法实现此功能。
总结区别
1.在接受简单类型值时,#{}中可以写value或者其他,${}中只可以写value
2.#{}可以防止sql注入,而${}不可以
3.在某些特殊的sql中,#{}中无法实现或者不好用,例如升降序
order by name #{value}
order by name ${value}