Mybatis-plus foreach拼接字符串查詢無數(shù)據(jù)返回問題
foreach拼接字符串查詢無數(shù)據(jù)返回
Mybatis-plus xml使用foreach遍歷查詢條件,填充IN函數(shù)時(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ù)賦值的時(shí)候,使用的是#{ }占位符號(hào),最后解析出的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解析的時(shí)是有區(qū)別的
精講#{}和${}的區(qū)別是什么?
經(jīng)常碰到這樣的面試題目:#{}和${}的區(qū)別是什么?
網(wǎng)上的答案是:
#{}是預(yù)編譯處理,${}是字符串替換。mybatis在處理#{}時(shí),會(huì)將sql中的#{}替換為?號(hào),調(diào)用PreparedStatement的set方法來賦值;mybatis在處理${}時(shí),就是把${}替換成變量的值。使用#{}可以有效的防止SQL注入,提高系統(tǒng)安全性。
對(duì)于這個(gè)問題我感覺要抓住兩點(diǎn)
(1)$符號(hào)一般用來當(dāng)作占位符,常使用Linux腳本的人應(yīng)該對(duì)此有更深的體會(huì)吧。既然是占位符,當(dāng)然就是被用來替換的。知道了這點(diǎn)就能很容易區(qū)分$和#,從而不容易記錯(cuò)了。
(2)預(yù)編譯的機(jī)制。預(yù)編譯是提前對(duì)SQL語句進(jìn)行預(yù)編譯,而其后注入的參數(shù)將不會(huì)再進(jìn)行SQL編譯。我們知道,SQL注入是發(fā)生在編譯的過程中,因?yàn)閻阂庾⑷肓四承┨厥庾址詈蟊痪幾g成了惡意的執(zhí)行操作。而預(yù)編譯機(jī)制則可以很好的防止SQL注入。
最后想說的是,對(duì)于mybatis以及sql而言,每一個(gè)考點(diǎn)背后都是有一個(gè)深刻的思想存在的,應(yīng)該好好的體會(huì)。這樣才能真正的做到技術(shù)提升,成為技術(shù)大牛。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解SpringBoot啟動(dòng)類的掃描注解的用法及沖突原則
這篇文章主要介紹了詳解SpringBoot啟動(dòng)類的掃描注解的用法及沖突原則,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA修改內(nèi)存大小,使得idea運(yùn)行更流暢的文章,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10JAVA超級(jí)簡(jiǎn)單的爬蟲實(shí)例講解
下面小編就為大家?guī)硪黄狫AVA超級(jí)簡(jiǎn)單的爬蟲實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10比較Java數(shù)組和各種List的性能小結(jié)
這篇文章主要是分別對(duì)Java數(shù)組、ArrayList、LinkedList和Vector進(jìn)行隨機(jī)訪問和迭代等操作,并比較這種集合的性能。有需要的可以參考借鑒。2016-08-08關(guān)于springboot響應(yīng)式編程整合webFlux的問題
在springboot2.x版本中提供了webFlux依賴模塊,該模塊有兩種模型實(shí)現(xiàn):一種是基于功能性端點(diǎn)的方式,另一種是基于SpringMVC注解方式,今天通過本文給大家介紹springboot響應(yīng)式編程整合webFlux的問題,感興趣的朋友一起看看吧2022-01-01使用java web 在jsp文件及Class中連接MySQL和SQLserver 的驅(qū)動(dòng)方法
這篇文章主要介紹了使用java web 在jsp文件及Class中連接MySQL和SQLserver的驅(qū)動(dòng)方法的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10SpringBoot實(shí)現(xiàn)application.yml文件敏感信息加密
本文主要介紹了SpringBoot實(shí)現(xiàn)application.yml文件敏感信息加密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07