Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題
foreach拼接字符串查詢無數(shù)據(jù)返回
Mybatis-plus xml使用foreach遍歷查詢條件,填充IN函數(shù)時,查詢不到數(shù)據(jù)
入?yún)?List<String>[A,B,C,D,E,F]
?WHERE sku_code IN ?<foreach collection="listHistoryBrowseDateVO.list" item="skuCode" index="index" open="(" close=")" ? ? ? ? ? separator=","> ? ? ?#{skuCode} ?</foreach>
以上代碼在迭代器中,給IN函數(shù)賦值的時候,使用的是#{ }占位符號,最后解析出的sql是:
WHERE sku_code IN (A,B,C,D,E,F)不符合IN函數(shù)填充查詢格式。
兩種解決方式
1、將入?yún)⑻幚頌椋?String ‘A’,‘B’,‘C’,‘D’,‘E’,‘F’,然后使用占位符 WHERE sku_code IN (#{}) 直接填充
2、入?yún)⑻幚頌椋篖ist [ ‘A’,‘B’,‘C’,‘D’,‘E’,‘F’],使用迭代器+拼接符${}
入?yún)?List<String> [ 'A','B','C','D','E','F']
?WHERE sku_code IN ?<foreach collection="listHistoryBrowseDateVO.list" item="skuCode" index="index" open="(" close=")" ? ? ? ? ? separator=","> ? ? ?${skuCode} ?</foreach>
Mybatis-plus #{} 占位符,${}拼接符,在sql解析的時是有區(qū)別的
精講#{}和${}的區(qū)別是什么?
經(jīng)常碰到這樣的面試題目:#{}和${}的區(qū)別是什么?
網(wǎng)上的答案是:
#{}是預編譯處理,${}是字符串替換。mybatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;mybatis在處理${}時,就是把${}替換成變量的值。使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性。
對于這個問題我感覺要抓住兩點
(1)$符號一般用來當作占位符,常使用Linux腳本的人應該對此有更深的體會吧。既然是占位符,當然就是被用來替換的。知道了這點就能很容易區(qū)分$和#,從而不容易記錯了。
(2)預編譯的機制。預編譯是提前對SQL語句進行預編譯,而其后注入的參數(shù)將不會再進行SQL編譯。我們知道,SQL注入是發(fā)生在編譯的過程中,因為惡意注入了某些特殊字符,最后被編譯成了惡意的執(zhí)行操作。而預編譯機制則可以很好的防止SQL注入。
最后想說的是,對于mybatis以及sql而言,每一個考點背后都是有一個深刻的思想存在的,應該好好的體會。這樣才能真正的做到技術提升,成為技術大牛。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
IntelliJ IDEA修改內(nèi)存大小,使得idea運行更流暢
今天小編就為大家分享一篇關于IntelliJ IDEA修改內(nèi)存大小,使得idea運行更流暢的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10使用java web 在jsp文件及Class中連接MySQL和SQLserver 的驅動方法
這篇文章主要介紹了使用java web 在jsp文件及Class中連接MySQL和SQLserver的驅動方法的相關資料,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下2016-10-10SpringBoot實現(xiàn)application.yml文件敏感信息加密
本文主要介紹了SpringBoot實現(xiàn)application.yml文件敏感信息加密,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07