mybatis中關(guān)于in的使用方法及說明
mybatis in的使用方法
很多人都想著拼接字符串用比如in(‘1’,‘2’)這樣的方式去獲取數(shù)據(jù),其實(shí)沒有這個(gè)必要,mybatis有foreach方法來自動(dòng)用這樣的數(shù)據(jù)
如下:
比如傳入的是roleIdList
//上面省略
xxxxx
WHERE ROLE_ID in
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item}
</foreach>
mybatis使用in做范圍查詢的坑
錯(cuò)誤展示
List<WmRecommendpic> selectPicListByMap(@Param("recommendIds")String recommendIds);
<select id="selectPicListByMap" resultType="xx.xx.WmRecommendpic" ? ? parameterType="java.util.Map">
?? ??? ?
?? ??? ?SELECT * FROM `WmRecommendpic`?
?? ??? ?WHERE type_id IN (
?? ??? ??? ?SELECT DISTINCT type_id FROM `wm_relationship`?
?? ??? ??? ?WHERE recommend_id IN (#{recommendIds})
?? ??? ??? ?AND is_valid=TRUE)
?? ??? ?AND is_valid=TRUE
?? ??? ?ORDER BY id ASC
</select>由于#是不能識(shí)別的 所以有兩種改法
改法1
<select id="selectPicListByMap" resultType="xx.xx.WmRecommendpic" ? ? parameterType="java.util.Map">
?? ??? ?
?? ??? ?SELECT * FROM `WmRecommendpic`?
?? ??? ?WHERE type_id IN (
?? ??? ??? ?SELECT DISTINCT type_id FROM `wm_relationship`?
?? ??? ??? ?WHERE recommend_id IN (${recommendIds})
?? ??? ??? ?AND is_valid=TRUE)
?? ??? ?AND is_valid=TRUE
?? ??? ?ORDER BY id ASC
</select>為啥能這樣改?
當(dāng)參數(shù)采用:#{} : 解析為一個(gè) JDBC 預(yù)編譯語句(prepared statement)的參數(shù)標(biāo)記符,一個(gè) #{ } 被解析為一個(gè)參數(shù)占位符 。${}: 僅僅為一個(gè)純碎的 string 替換,在動(dòng)態(tài) SQL 解析階段將會(huì)進(jìn)行變量替換。
這種改法看似簡單,但是會(huì)有安全隱患,容易遭黑客跨腳本攻擊。
所以推薦第二種改法。
改法2
List<WmRecommendpic> selectPicListByMap(Map<String,Object> map);
Map<String,Object> map = new HashMap<>();
map.put("recommendIds", recommendId.split(","));
return this.dao.selectPicListByMap(map);<select id="selectPicListByMap" resultType="cn.smarthse.modules.platform.entity.apps.WmRecommendpic" parameterType="java.util.Map">
SELECT * FROM `wm_recommendpic`
WHERE type_id IN (
SELECT DISTINCT type_id FROM `wm_relationship`
WHERE recommend_id IN
<foreach item="recommendId" index="index" collection="recommendIds" open="(" separator="," close=")">
#{recommendId}
</foreach>
AND is_valid=TRUE)
AND is_valid=TRUE
ORDER BY id ASC
</select>這里還是使用#{},這樣就不會(huì)遭受跨腳本的攻擊了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中如何使用?byte?數(shù)組作為?Map?的?key
本文將討論在使用HashMap時(shí),當(dāng)byte數(shù)組作為key時(shí)所遇到的問題及其解決方案,介紹使用String和List這兩種數(shù)據(jù)結(jié)構(gòu)作為臨時(shí)解決方案的方法,感興趣的朋友跟隨小編一起看看吧2023-06-06
Java 使用POI生成帶聯(lián)動(dòng)下拉框的excel表格實(shí)例代碼
本文通過實(shí)例代碼給大家分享Java 使用POI生成帶聯(lián)動(dòng)下拉框的excel表格,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09
Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解
這篇文章主要為大家介紹了Spring?Cloud?Hystrix?服務(wù)降級(jí)限流策略詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Java中的notyfy()和notifyAll()的本質(zhì)區(qū)別
很多朋友對(duì)java中的notyfy()和notifyAll()的本質(zhì)區(qū)別不了解,今天小編抽空給大家整理一篇教程關(guān)于Java中的notyfy()和notifyAll()的本質(zhì)區(qū)別,需要的朋友參考下吧2017-02-02

