最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis雙重foreach如何實現(xiàn)遍歷map中的兩個list數(shù)組

 更新時間:2024年09月24日 10:17:00   作者:flytalei  
本文介紹了如何解析前端傳遞的JSON字符串并在Java后臺動態(tài)構(gòu)建SQL查詢條件,首先,通過JSONArray.fromObject()將JSON字符串轉(zhuǎn)化為JSONArray對象,遍歷JSONArray,從中提取name和infos,構(gòu)建成Map對象用于Mybatis SQL映射

實現(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ù)組下標為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標簽說明

  • 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ù)組下標,0,1,2,3......等,可以看出這里我填寫的標簽屬性是index="key",下面and拼接時取得就是$key這個變量and ${key} in
  • open: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)文章

  • SpringBoot中進行事務(wù)回滾的方法

    SpringBoot中進行事務(wù)回滾的方法

    在Spring Boot中,可以使用TransactionTemplate或@Transactional注解來進行事務(wù)管理,本文主要介紹了SpringBoot中進行事務(wù)回滾的方法,感興趣的可以了解一下
    2023-11-11
  • java實現(xiàn)JSON字符串格式化輸出

    java實現(xiàn)JSON字符串格式化輸出

    這篇文章主要為大家詳細介紹了如何使用java實現(xiàn)JSON字符串格式化輸出,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解下
    2024-01-01
  • SpringBoot如何查看和修改依賴的版本

    SpringBoot如何查看和修改依賴的版本

    這篇文章主要介紹了SpringBoot如何查看和修改依賴的版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 關(guān)于spring依賴注入的方式以及優(yōu)缺點

    關(guān)于spring依賴注入的方式以及優(yōu)缺點

    這篇文章主要介紹了關(guān)于spring依賴注入的方式以及優(yōu)缺點,依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋,這概念是說你不用創(chuàng)建對象,而只需要描述它如何被創(chuàng)建,需要的朋友可以參考下
    2023-07-07
  • 深入分析java文件路徑的詳解

    深入分析java文件路徑的詳解

    本篇文章是對java文件路徑進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一文講解如何解決Java中的IllegalArgumentException異常

    一文講解如何解決Java中的IllegalArgumentException異常

    這篇文章主要給大家介紹了關(guān)于如何解決Java中IllegalArgumentException異常的相關(guān)資料,IllegalArgumentException是Java中的一個標準異常類,通常在方法接收到一個不合法的參數(shù)時拋出,需要的朋友可以參考下
    2024-03-03
  • Java日期時間字符串和毫秒相互轉(zhuǎn)換的方法

    Java日期時間字符串和毫秒相互轉(zhuǎn)換的方法

    這篇文章主要為大家詳細介紹了Java日期時間字符串和毫秒相互轉(zhuǎn)換的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java中的隨機數(shù)Random

    Java中的隨機數(shù)Random

    這篇文章主要介紹了Java中的隨機數(shù)Random,關(guān)于隨機數(shù)的介紹不設(shè)置隨機數(shù)種子,你每次隨機抽樣得到的數(shù)據(jù)都是不一樣的。設(shè)置了隨機數(shù)種子,能夠確保每次抽樣的結(jié)果一樣,下面來了解具體的詳細內(nèi)容介紹吧
    2022-03-03
  • 詳解Spring Boot中Controller用法

    詳解Spring Boot中Controller用法

    Controller是SpringBoot里最基本的組件,他的作用是把用戶提交來的請求通過對URL的匹配,分配個不同的接收器,再進行處理,然后向用戶返回結(jié)果。下面通過本文給大家介紹Spring Boot中Controller用法,需要的朋友參考下
    2017-05-05
  • SpringDataMongoDB多文檔事務(wù)的實現(xiàn)

    SpringDataMongoDB多文檔事務(wù)的實現(xiàn)

    mongodb4.0也出來一段時間了,這個版本最為大眾期待的特性就是支持了多文檔事務(wù)。這篇文章主要介紹了SpringDataMongoDB多文檔事務(wù)的實現(xiàn),感興趣的小伙伴們可以參考一下
    2018-11-11

最新評論

贵南县| 屏边| 齐河县| 扎鲁特旗| 巨鹿县| 嘉黎县| 商洛市| 儋州市| 泰顺县| 龙井市| 株洲县| 吉首市| 泸州市| 淮阳县| 锡林郭勒盟| 友谊县| 龙口市| 修水县| 象山县| 得荣县| 改则县| 漾濞| 宜川县| 专栏| 三江| 东海县| 北辰区| 商水县| 青河县| 林口县| 余庆县| 靖远县| 句容市| 宁明县| 纳雍县| 徐汇区| 紫金县| 新余市| 镇康县| 阿拉善右旗| 卓尼县|