在預編譯中的處理是不一樣的。#{} 在預處理時,會把參數部分用一個占位符 ? 代替,變成如下的 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解析階段。
