MyBatis中使用#{}和${}的區別

 

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

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

區別:java

在動態SQL解析階段,#{}會被解析爲JDBC預編譯語句的參數標記符(佔位符),例如上面的#{}語句將被解析爲:性能

select * from table_name where id=? ;

  而${}則直接解析爲字符串變量替換,當變量id的傳參爲"xiaoming"時,上面的${}語句將被解析爲:.net

select * from table_name where id='xiaoming';

  也就是說,對於變量替換,#{}發生在DBMS中,而${}發生在動態SQL解析階段。blog

實際使用:字符串

一、當變量爲表名時,只能使用${},這是由於#{}解析的佔位符在進行變量替換時,會帶上單引號' ',表名帶單引號會致使SQL錯誤。編譯

二、除了上面第1條以外,能用#{}的地方儘可能用#{},這是由於相同的預編譯SQL能夠複用,用#{}可以節能開銷提升性能;${}會引發SQL注入問題,例如:table

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

  當tableName爲 " user; delete user; --"時,SQL將被解析爲:class

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

  這樣就形成了嚴重後果(-- 等於註釋)。變量

 

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

相關文章
相關標籤/搜索