码迷,mamicode.com
首页 > 其他好文 > 详细

MyBatis中使用#{}和${}的区别

时间:2017-11-03 18:58:53      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:--   sql   sel   语句   select   高性能   jdbc   表名   sql注入   

 

select * from table_name where id=#{id};

select * from table_name where id=${id}; 

区别:

在动态SQL解析阶段,#{}会被解析为JDBC预编译语句的参数标记符(占位符),例如上面的#{}语句将被解析为:

select * from table_name where id=? ;

  而${}则直接解析为字符串变量替换,当变量id的传参为"xiaoming"时,上面的${}语句将被解析为:

select * from table_name where id=‘xiaoming‘;

  也就是说,对于变量替换,#{}发生在DBMS中,而${}发生在动态SQL解析阶段。

实际使用:

1、当变量为表名时,只能使用${},这是因为#{}解析的占位符在进行变量替换时,会带上单引号‘ ‘,表名带单引号会导致SQL错误。

2、除了上面第1条之外,能用#{}的地方尽量用#{},这是因为相同的预编译SQL可以复用,用#{}能够节能开销提高性能;${}会引起SQL注入问题,例如:

select * from ${tableName} where name = #{name} 

  当tableName为 " user; delete user; --"时,SQL将被解析为:

select * from user; delete user; -- where name = ?;

  这样就造成了严重后果(-- 等于注释)。

 

参考:http://blog.csdn.net/pfnie/article/details/53230994

MyBatis中使用#{}和${}的区别

标签:--   sql   sel   语句   select   高性能   jdbc   表名   sql注入   

原文地址:http://www.cnblogs.com/guodongdidi/p/7779326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!