mybatis雙重foreach如何實現(xiàn)遍歷map中的兩個list數(shù)組
實現(xiàn)背景
前端傳值時可能會有多個字段傳遞過來,需要后臺將這多個字段拼接為 name in (? , ?) and name1 in (? , ?) and name2 in (? , ?) 作為sql查詢條件…
如下圖sql語句,即實現(xiàn)多個and xxx in(?,?,?) 拼接
select * from web_ztlc_provateequity WHERE cords in ( ? , ? , ? ) and productName in ( ? , ? , ? ) and product_id in ( ? , ? , ? )
前端傳值的格式
前端傳遞的是json字符串,json中name和infos是一對具有對應(yīng)關(guān)系的對象,且json中會有多條這種對象,即此對象是一個數(shù)組。
而infos中也會有多條數(shù)據(jù),即infos也是一個數(shù)組對象。所以最終前端傳遞過來json格式如下
json字符串: itemList:[{"name":"cords", "infos":["2", "2222", "2223","2224","2225","2226"] }, {"name":"productName", "infos":["2號B","SAP智龍3號私募證券投資基金","一村金衍10號第1期"]}]
Debug斷點調(diào)試java如何解析json對象
綜上所述,后臺Java接口在獲取到j(luò)son字符串后,需要遍歷json中的兩個數(shù)組對象,即name和infos
//模擬數(shù)據(jù)測試前端傳參 String itemList="[{ \"name\":\"cords\", \"infos\":[ \"2\", \"2222\", \"2223\",\"2224\",\"2225\",\"2226\" ] },{ \"name\":\"productName\", \"infos\":[ \"2號B\",\"SAP智龍3號私募證券投資基金\",\"一村金衍10號第1期\" ] }]"; //獲取前端傳過來的參數(shù)數(shù)組 //String itemList = request.getParameter("itemList"); if(!StringUtils.isEmpty(itemList)){ //將參數(shù)數(shù)組轉(zhuǎn)化為json數(shù)組類型 JSONArray jsonArray = JSONArray.fromObject(itemList); if(jsonArray.size()!=0){ Map<String,Object> columnMap = new HashMap<>(); //遍歷jsonarray數(shù)組 for(int i = 0;i < jsonArray.size(); i++) { net.sf.json.JSONObject job = jsonArray.getJSONObject(i); String name = job.getString("name"); List<String> lists =job.getJSONArray("infos"); if(lists.size()!= 0){ columnMap.put(name,lists); } } hm.put("columnMap",columnMap); }else{ return null; } }
第一步 JSONArray.fromObject()
JSONArray jsonArray = JSONArray.fromObject(itemList);
從上圖可以看出JSONArray.fromObject(itemList)后,jsonArray已經(jīng)size=2(解析出了兩條json對象,每條對象又由name和infos各自的鍵值對(key =>value)組成,name中name為key,cords為value(這里的cords就是后面我們sql語句中需要拼接的and條件的字段值);
infos中的key為infos,而value又是一個數(shù)組對象(這個數(shù)組里的各個對象,就是我們后面sql語句中需要拼接的in的條件))
第二步 遍歷jsonArray
由第一步可以看出此時jsonArray里已經(jīng)存放了數(shù)組下標(biāo)為0和1的兩條數(shù)據(jù),那么此時我們就挨個的取出這兩條數(shù)據(jù)(也就是遍歷啦)
第一次for循環(huán)0數(shù)組,取出0數(shù)組中的name和infos,可以看出我們聲明了一個lists數(shù)組,由來存放infos中的所以數(shù)值
如下圖,我們同時還聲明了一個columnMap的Map對象,此對象用來存儲從json中獲取到的name和infos。
將name和infos封裝成鍵值對(key=>value)的Map對象,將來傳遞給Mybatis的parameterType="hashmap"的入?yún)傩?通過key來找value。
每次for循環(huán)就放一個鍵值對對象進columnMap,我們這里測試數(shù)據(jù)只有兩條,所以columnMap最終會被放進兩個鍵值對對象即columnMap的size=2.
第三步 mybatis雙重foreach
此時mybatis雙重foreach的雛形就出來了,因為columnMap中已經(jīng)有2個key=>value對象了。也就意味著有多個key,而每個key又對應(yīng)多個value。所以此時mybais的foreach循環(huán)就得嵌套,第一次循環(huán)key,循環(huán)key時又得循環(huán)key對應(yīng)的多個value
最終需要foreach雙重遍歷的Map集合的數(shù)據(jù)結(jié)構(gòu)
columnMap為key的value中又存在多個key/value對象,columnMap的結(jié)構(gòu)如下
<select id="queryAllWebZtlcProvateequity" resultMap="BaseResultMap" parameterType="hashmap"> select * from web_ztlc_provateequity <where> <if test="columnMap != null and columnMap !=''"> <foreach item="item" collection="columnMap.entrySet()" index="key" > and ${key} in <foreach item="value" collection="item" open="(" close=")" separator=","> #{value} </foreach> </foreach> </if> </where> </select>
foreach標(biāo)簽說明
collection
:需要遍歷的對象,以上代碼可以看出我寫的是collection="columnMap.entrySet()",columnMap是我封裝的Map對象,而entrySet()則是Map的內(nèi)置方法,存儲的是Map中的鍵值對集合,此時第一個foreach就是在遍歷Map中的key。item
:遍歷時每個元素遍歷出來時的別名,這個別名有用,我們第二次foreach是會用到,因為第一次foreach的是key集合,那么第二次foreach時就得遍歷key對應(yīng)的value集合。index
:表示索引,也就是遍歷集合中的數(shù)組下標(biāo),0,1,2,3......等,可以看出這里我填寫的標(biāo)簽屬性是index="key",下面and拼接時取得就是$key這個變量and ${key} inopen
:in語句循環(huán)開始的符號,我們知道sql中in后面的條件是用()括起來的,所以這里我們填寫的屬性是open="("close
:in語句循環(huán)結(jié)束的符號,同上,有開始就有結(jié)束,所以這里我們填寫的屬性是close=")"separator
:多個條件拼接時的分隔符,我們知道in語句中會有多個條件即in(1,2,3,4)而多個條件使用逗號分割,所以這里我們填寫的屬性是separator=","
最終效果
最后由控制臺可以看出,我們已經(jīng)成功拼接了and xxx in (?,?,?)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis多對多關(guān)聯(lián)實戰(zhàn)教程(推薦)
下面小編就為大家?guī)硪黄猰ybatis多對多關(guān)聯(lián)實戰(zhàn)教程(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10java搭建一個Socket服務(wù)器響應(yīng)多用戶訪問
本篇文章主要介紹了java搭建一個Socket服務(wù)器響應(yīng)多用戶訪問,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Java網(wǎng)絡(luò)編程之簡易聊天室的實現(xiàn)
這篇文章主要為大家詳細介紹了如何利用Java語言實現(xiàn)一個簡易聊天室功能,可以實現(xiàn)運行客戶端和連接服務(wù)器,文中的示例代碼講解詳細,需要的可以了解一下2022-10-10Springboot?上傳文件或頭像(MultipartFile、transferTo)
本文主要介紹了Springboot?上傳文件或頭像(MultipartFile、transferTo),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04