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