国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

MyBatis中#{}和${}的區(qū)別詳解

2019-11-26 13:58:08
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

最近在用mybatis,之前用過(guò)ibatis,總體來(lái)說(shuō)差不多,不過(guò)還是遇到了不少問(wèn)題,再次記錄下.

先給大家介紹下MyBatis中#{}和${}的區(qū)別,具體介紹如下:

1. #將傳入的數(shù)據(jù)都當(dāng)成一個(gè)字符串,會(huì)對(duì)自動(dòng)傳入的數(shù)據(jù)加一個(gè)雙引號(hào)。如:order by #user_id#,如果傳入的值是111,那么解析成sql時(shí)的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".

2. $將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時(shí)的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id.

3. #方式能夠很大程度防止sql注入。 

4.$方式無(wú)法防止Sql注入。

5.$方式一般用于傳入數(shù)據(jù)庫(kù)對(duì)象,例如傳入表名.

6.一般能用#的就別用$.

MyBatis排序時(shí)使用order by 動(dòng)態(tài)參數(shù)時(shí)需要注意,用$而不是#

字符串替換

默認(rèn)情況下,使用#{}格式的語(yǔ)法會(huì)導(dǎo)致MyBatis創(chuàng)建預(yù)處理語(yǔ)句屬性并以它為背景設(shè)置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時(shí)你只是想直接在SQL語(yǔ)句中插入一個(gè)不改變的字符串。比如,像ORDER BY,你可以這樣來(lái)使用:
ORDER BY ${columnName}

這里MyBatis不會(huì)修改或轉(zhuǎn)義字符串。

重要:接受從用戶輸出的內(nèi)容并提供給語(yǔ)句中不變的字符串,這樣做是不安全的。這會(huì)導(dǎo)致潛在的SQL注入攻擊,因此你不應(yīng)該允許用戶輸入這些字段,或者通常自行轉(zhuǎn)義并檢查。

mybatis本身的說(shuō)明:

String SubstitutionBy 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. 使用#{}格式的語(yǔ)法在mybatis中使用Preparement語(yǔ)句來(lái)安全的設(shè)置值,執(zhí)行sql類似下面的:

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

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

2. 不過(guò)有時(shí)你只是想直接在 SQL 語(yǔ)句中插入一個(gè)不改變的字符串。比如,像 ORDER BY,你可以這樣來(lái)使用:

ORDER BY ${columnName} 

此時(shí)MyBatis 不會(huì)修改或轉(zhuǎn)義字符串。

這種方式類似于:

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

這種方式的缺點(diǎn)是:

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新乡县| 吉林市| 巍山| 田阳县| 志丹县| 克拉玛依市| 丹巴县| 荥阳市| 绵阳市| 霸州市| 通城县| 安泽县| 百色市| 五原县| 玉溪市| 凤冈县| 卓尼县| 溧水县| 武隆县| 油尖旺区| 岐山县| 江安县| 图们市| 榆社县| 济宁市| 达州市| 奇台县| 孟村| 博乐市| 阳泉市| 东平县| 滨州市| 太保市| 双江| 监利县| 宜川县| 资阳市| 光泽县| 根河市| 扎鲁特旗| 淅川县|