mybatis中$和#的区别
1.例子
mybatis中${param}和#{param}正常解析为如下:
select * from user where name = 'root';
2.区别
只是在预编译时,$和#会有区别。#在预编译时会把参数替换成占位符?,如下:
select * from user where name = ?;
而$只是纯粹的把参数的值当成字符串替换进来,如下:
select * from user where name = '${param}';
动态解析${param}之后,会将我们传入的参数当做String字符串填充到我们的语句中,就会变成下面的语句
select * from user where name = 'root';
以上,#{} 的参数替换是发生在 DBMS 中,而 ${} 则发生在动态解析过程中。
最根本的区别在于,$传参会导致SQL注入问题产生。举例:
select * from ${tablename} where name = #{name}
假如上述SQL中的${tablename}传入:
user; delete user; --
则动态解析之后 sql 如下:
select * from user; delete user; -- where name = ?;
此语句的含义就变成了,先查询user表,然后删除user表。--表示注释。--后语句不会执行。这样就会对数据库造成很大的伤害。