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

最新文章

  1. 【流程管理】【PCB】PCB设计流程
  2. 转I2s
  3. BZOJ 1066 【SCOI2007】 蜥蜴
  4. window下从硬盘安装linux系统iso镜像文件的方法
  5. ORACLE快速彻底Kill掉的会话(转载)
  6. 学习练习 java 实例属性 静态属性
  7. 【C/C++运行时库】 /MT /MTd /MD /MDd对C/C++运行库的影响
  8. UDP—Socket,套接字聊天简单的聊天程序。
  9. 利用servlet做转发,实现js跨域解决同源问题
  10. poj 1007 纯水题 排序
  11. DISCUZ积分及点评需求
  12. java中的取整(/)和求余(%)
  13. SQLServer之创建标量函数
  14. python3-基础8
  15. Java之所有对象的公用方法>9.Always override hashCode when you override equals
  16. 【cocos2d-x 手游研发----博彩大转盘】
  17. [洛谷P5147]随机数生成器
  18. 事务时间如何去掉wasted time
  19. JavaSE 第二次学习随笔(四)
  20. [Leetcode] Reverse linked list ii 反转链表

热门文章

  1. 转载自知乎大神---this 的值到底是什么?一次说清楚
  2. 20155303 2016-2017-2 《Java程序设计》第六周学习总结
  3. zabbix user parameters和Loadable modules的使用方法介绍
  4. 第10月第1天 iOS crash
  5. Python程序员之面试必回习题
  6. 关于markdown文件插入图片遇到的小问题和解决办法
  7. 如何使用optipng压缩png图片
  8. 通过JavaScript自由切换iframe
  9. centos7更改网卡名
  10. 【Android开发】之Fragment重要函数讲解