sql中 #{} 和 ${}


在預編譯中的處理是不一樣的。#{} 在預處理時,會把參數部分用一個占位符 ? 代替,變成如下的 sql 語句:select * from user where name = ?;

而 ${} 則只是簡單的字符串替換,在動態解析階段,該 sql 語句會被解析成:select * from user where name = 'zhangsan';

因此,優先使用 #{}。因為 ${} 會導致 sql 注入的問題!

表名、order by的排序字段作為變量時,使用${}。

1、#{}
解析為一個JDBC預編譯語句(prepared statement)的參數標記符,把參數部分用占位符?代替。動態解析為:
select * from t_user where username = ? ;
而傳入的參數將會經過PreparedStatement方法的強制類型檢查和安全檢查等處理,最后作為一個合法的字符串傳入。
2、${}
這種方式只會做簡單的字符串替換,在動態SQL解析階段將會進行變量替換,假如傳遞的參數為Alice,最終處理結果如下:
select * from t_user where username = 'Alice' ;
這樣在預編譯之前的sql語句已經不包含變量了,因此可以看出${} 變量的替換階段是在動態SQL解析階段。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM