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