首先看下下面两个sql语句的区别:
<select id="selectByNameAndPassword" parameterType="java.util.Map" resultMap="BaseResultMap">
select id, username, password
from user
where username = #{username}
</select>
<select id="selectByNameAndPassword" parameterType="java.util.Map" resultMap="BaseResultMap">
select id, username, password
from user
where username = ${username}
</select>
mybatis中的#和$的区别:
1、#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。特就是说如:where username=#{username},如果传入的值是测试,那么解析成sql时的值为where username=“测试”
2、$会将传入的数据直接显示生成在sql中。如果传入的值是;drop table user;,则解析成的sql为:select id, username, password, role from user where username=;drop table user;
总结:
1、#方式能够很大程度防止sql注入,$方式无法防止Sql注入。
2、#{}:相当于JDBC中的PreparedStatement ,${}:是输出变量的值
3、#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。