一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - MyBatis中#{}和${}的區別詳解

MyBatis中#{}和${}的區別詳解

2020-06-05 14:57jason.bai JAVA教程

mybatis和ibatis總體來講都差不多的。下面小編給大家探討下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本身的說明:

?
1
2
3
4
5
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類似下面的:

?
1
2
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);

這樣做的好處是:更安全,更迅速,通常也是首選做法。

2. 不過有時你只是想直接在 SQL 語句中插入一個不改變的字符串。比如,像 ORDER BY,你可以這樣來使用:

?
1
ORDER BY ${columnName}

此時MyBatis 不會修改或轉義字符串。

這種方式類似于:

?
1
2
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql);

這種方式的缺點是:

以這種方式接受從用戶輸出的內容并提供給語句中不變的字符串是不安全的,會導致潛在的 SQL 注入攻擊,因此要么不允許用戶輸入這些字段,要么自行轉義并檢驗。

原文鏈接:http://www.cnblogs.com/baizhanshi/p/5778692.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2020国产精品视频 | 国产三级精品三级男人的天堂 | 美女被到爽流动漫 | 无限好资源第一片免费韩国 | 日韩成人在线影院 | 天堂网在线.www天堂在线资源 | 欧美香蕉视频 | 亚洲精品一区二区三区在线播放 | 男女男精品视频免费观看 | 福利视频导航大全 | 91久久夜色精品国产九色 | 99精品热线在线观看免费视频 | 国产成人成人一区二区 | 高清不卡日本v在线二区 | 色啪久久婷婷综合激情 | 国产成人综合网亚洲欧美在线 | 韩国女主播在线大尺无遮挡 | 日本aa大片在线播放免费看 | 青草园网站在线观看 | 国产免费精彩视频 | 久久re这里精品23 | 国产精品福利短视在线播放频 | 韩国三级在线高速影院 | 青青草影院在线观看 | 国产在线欧美精品 | 日韩成人小视频 | 精品一区久久 | 亚洲国产欧美另类 | 亚洲网红精品大秀在线观看 | 成人免费体验区福利云点播 | 91原创国产| 俺去啦最新地址 | 国语刺激对白勾搭视频在线观看 | 天美影视传媒mv直接看 | 国内自拍网红在线自拍综合 | 国产精品男人的天堂 | 天堂在线国产 | 欧美极品摘花过程 | 国产美女极品免费视频 | 亚洲欧美在线观看一区二区 | 亚洲情欲网 |