MyBatis中#{}和${}的差別詳解。本站提示廣大學習愛好者:(MyBatis中#{}和${}的差別詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是MyBatis中#{}和${}的差別詳解正文
比來在用mybatis,之前用過ibatis,整體來講差不多,不外照樣碰到了很多成績,再次記載下.
先給年夜家引見下MyBatis中#{}和${}的差別,詳細引見以下:
1. #將傳入的數據都當做一個字符串,會對主動傳入的數據加一個雙引號。如:order by #user_id#,假如傳入的值是111,那末解析成sql時的值為order by "111", 假如傳入的值是id,則解析成的sql為order by "id".
2. $將傳入的數據直接顯示生成在sql中。如:order by $user_id$,假如傳入的值是111,那末解析成sql時的值為order by user_id, 假如傳入的值是id,則解析成的sql為order by id.
3. #方法可以或許很年夜水平避免sql注入。
4.$方法沒法避免Sql注入。
5.$方法普通用於傳入數據庫對象,例如傳入表名.
6.普通能用#的就別用$.
MyBatis排序時應用order by 靜態參數時須要留意,用$而不是#
字符串調換
默許情形下,應用#{}格局的語法會招致MyBatis創立預處置語句屬性並以它為配景設置平安的值(好比?)。如許做很平安,很敏捷也是首選做法,有時你只是想直接在SQL語句中拔出一個不轉變的字符串。好比,像ORDER BY,你可以如許來應用:
ORDER BY ${columnName}
這裡MyBatis不會修正或本義字符串。
主要:接收從用戶輸入的內容並供給給語句中不變的字符串,如許做是不平安的。這會招致潛伏的SQL注入進擊,是以你不該該許可用戶輸出這些字段,或許平日自行本義並檢討。
mybatis自己的解釋:
String Substitution By default, using the #{} syntax will cause MyBatis to generate PreparedStatement properties and set the values safely against the PreparedStatement parameters (e.g. ?). While this is safer, faster and almost always preferred, sometimes you just want to directly inject a string unmodified into the SQL Statement. For example, for ORDER BY, you might use something like this: ORDER BY ${columnName} Here MyBatis won't modify or escape the string. NOTE It's not safe to accept input from a user and supply it to a statement unmodified in this way. This leads to potential SQL Injection attacks and therefore you should either disallow user input in these fields, or always perform your own escapes and checks.
從上文可以看出:
1. 應用#{}格局的語法在mybatis中應用Preparement語句來平安的設置值,履行sql相似上面的:
PreparedStatement ps = conn.prepareStatement(sql); ps.setInt(1,id);
如許做的利益是:更平安,更敏捷,平日也是首選做法。
2. 不外有時你只是想直接在 SQL 語句中拔出一個不轉變的字符串。好比,像 ORDER BY,你可以如許來應用:
ORDER BY ${columnName}
此時MyBatis 不會修正或本義字符串。
這類方法相似於:
Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql);
這類方法的缺陷是:
以這類方法接收從用戶輸入的內容並供給給語句中不變的字符串是不平安的,會招致潛伏的 SQL 注入進擊,是以要末不許可用戶輸出這些字段,要末自行本義並磨練。