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表。--表示注释。--后语句不会执行。这样就会对数据库造成很大的伤害。

posted @ 2018-08-09 17:14  Vanilla香草阿  阅读(189)  评论(0编辑  收藏  举报