溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MyBatis中$和#各代表什么

發布時間:2020-10-29 20:51:33 來源:億速云 閱讀:210 作者:Leah 欄目:開發技術

MyBatis中$和#各代表什么?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

1、#{ }是預編譯處理,MyBatis在處理#{ }時,它會將sql中的#{ }替換為?,然后調用PreparedStatement的set方法來賦值,傳入字符串后,會在值兩邊加上單引號,如上面的值 “4,44,514”就會變成“ ‘4,44,514' ”;

2、${ }是字符串替換, MyBatis在處理${ }時,它會將sql中的${ }替換為變量的值,傳入的數據不會加兩邊加上單引號。

注意:使用${ }會導致sql注入,不利于系統的安全性!

SQL注入:就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

常見的有匿名登錄(在登錄框輸入惡意的字符串)、借助異常獲取數據庫信息等 應用場合:

1、#{ }:主要用戶獲取DAO中的參數數據,在映射文件的SQL語句中出現#{}表達式,底層會創建預編譯的SQL;

2、${ }:主要用于獲取配置文件數據,DAO接口中的參數信息,當$出現在映射文件的SQL語句中時創建的不是預編譯的SQL,而是字符串的拼接,有可能會導致SQL注入問題.所以一般使用$接收dao參數時,這些參數一般是字段名,表名等,例如order by {column}。

注:

${}獲取DAO參數數據時,參數必須使用@param注解進行修飾或者使用下標或者參數#{param1}形式;

#{}獲取DAO參數數據時,假如參數個數多于一個可有選擇的使用@param。

其實剛開始我也沒太去看sql里的#和$,我把sql放到數據庫跑一切正常,所以我就將代碼的執行sql輸出到控制臺了,具體是這么一個輸出sql的配置文件:

MyBatis中$和#各代表什么

輸出后,終于發現了問題在哪里。。。。

看了上面的區別介紹,相信大家其實都應該知道區別在哪里,我們的問題在哪里,其實就是sql在in的時候 ,里面的數據被加了兩個雙引號?!皐wlr.LabelId in(4,44,514)就會變成 wwlr.LabelId in('4,44,514′ );所以導致部分數據查不到了。

解決辦法

1、快速解決

最快的方法就是把#直接替換成$,這樣問題應該就可以解決了。

但是,我很無語,我確沒有解決。

本地跑代碼一點問題都沒有,部署到公司的docker上問題一樣沒解決,給人的感覺就是代碼根本沒有從#變$。

大家都知道$其實是有危險性,會容易被sql注入,具我所知道,我們公司的docker是會加一層防止 sql注入的功能 ,所以不知道是不是這個功能把的$無效掉了。

當然,我也沒有去再到服務上打出sql來看一下,因為本來$就是不太安全的,所以我換了一種方式處理。 2、foreach標簽的使用

foreach標簽主要用于構建in條件,他可以在sql中對集合進行迭代。

先來看看語法:

MyBatis中$和#各代表什么

通過上圖,大家也應該也了解和使用這個標簽了吧。

那對于我們項目中的改造,其實就是把原來傳進來的字符型參數變成List<Integer>,這樣問題就完美的解決了,既實現了我們的功能 ,又解決了安全性問題。

關于MyBatis中$和#各代表什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女