mybatis双重foreach实现遍历map中的两个list数组

news2024/10/6 5:54:28

文章目录

  • 实现背景:
  • 前端传值的格式
  • Debug断点调试java如何解析json对象
    • 第一步 JSONArray.fromObject()
    • 第二步 遍历jsonArray
    • 第三步 mybatis双重foreach
  • foreach标签说明
  • 最终效果

实现背景:

前端传值时可能会有多个字段传递过来,需要后台将这多个字段拼接为 name in (? , ?) and name1 in (? , ?) and name2 in (? , ?) 作为sql查询条件…如下图sql语句,即实现多个and xxx in(?,?,?) 拼接

select * from web_ztlc_provateequity WHERE
 cords in ( ? , ? , ?  ) 
 and productName in ( ? , ? , ? ) 
 and product_id in ( ? , ? , ? )

前端传值的格式

前端传递的是json字符串,json中name和infos是一对具有对应关系的对象,且json中会有多条这种对象,即此对象是一个数组。而infos中也会有多条数据,即infos也是一个数组对象。所以最终前端传递过来json格式如下

json字符串:
itemList:[{"name":"cords", "infos":["2", "2222", "2223","2224","2225","2226"] },
          {"name":"productName", "infos":["2号B","SAP智龙3号私募证券投资基金","一村金衍10号第1期"]}]

Debug断点调试java如何解析json对象

综上所述,后台Java接口在获取到json字符串后,需要遍历json中的两个数组对象,即name和infos

		//模拟数据测试前端传参
		String itemList="[{ \"name\":\"cords\", \"infos\":[ \"2\", \"2222\", \"2223\",\"2224\",\"2225\",\"2226\" ] },{ \"name\":\"productName\", \"infos\":[ \"2号B\",\"SAP智龙3号私募证券投资基金\",\"一村金衍10号第1期\" ] }]";
		//获取前端传过来的参数数组
        //String itemList = request.getParameter("itemList");
		if(!StringUtils.isEmpty(itemList)){
			//将参数数组转化为json数组类型
			JSONArray jsonArray = JSONArray.fromObject(itemList);
			if(jsonArray.size()!=0){
				Map<String,Object> columnMap = new HashMap<>();
 				//遍历jsonarray数组
				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已经size=2(解析出了两条json对象,每条对象又由name和infos各自的键值对(key =>value)组成,name中name为key,cords为value(这里的cords就是后面我们sql语句中需要拼接的and条件的字段值);infos中的key为infos,而value又是一个数组对象(这个数组里的各个对象,就是我们后面sql语句中需要拼接的in的条件))
在这里插入图片描述

第二步 遍历jsonArray

由第一步可以看出此时jsonArray里已经存放了数组下标为0和1的两条数据,那么此时我们就挨个的取出这两条数据(也就是遍历啦)
第一次for循环0数组,取出0数组中的name和infos,可以看出我们声明了一个lists数组,由来存放infos中的所以数值
在这里插入图片描述

如下图,我们同时还声明了一个columnMap的Map对象,此对象用来存储从json中获取到的name和infos。将name和infos封装成键值对(key=>value)的Map对象,将来传递给Mybatis的parameterType="hashmap"的入参属性,通过key来找value。
在这里插入图片描述
每次for循环就放一个键值对对象进columnMap,我们这里测试数据只有两条,所以columnMap最终会被放进两个键值对对象即columnMap的size=2.
在这里插入图片描述

第三步 mybatis双重foreach

此时mybatis双重foreach的雏形就出来了,因为columnMap中已经有2个key=>value对象了。也就意味着有多个key,而每个key又对应多个value。所以此时mybais的foreach循环就得嵌套,第一次循环key,循环key时又得循环key对应的多个value

最终需要foreach双重遍历的Map集合的数据结构
columnMap为key的value中又存在多个key/value对象,columnMap的结构如下
在这里插入图片描述

<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的内置方法,存储的是Map中的键值对集合,此时第一个foreach就是在遍历Map中的key。

item:遍历时每个元素遍历出来时的别名,这个别名有用,我们第二次foreach是会用到,因为第一次foreach的是key集合,那么第二次foreach时就得遍历key对应的value集合。

index:表示索引,也就是遍历集合中的数组下标,0,1,2,3......等,可以看出这里我填写的标签属性是index="key",下面and拼接时取得就是$key这个变量and ${key} in

open:in语句循环开始的符号,我们知道sql中in后面的条件是用()括起来的,所以这里我们填写的属性是open="("

close:in语句循环结束的符号,同上,有开始就有结束,所以这里我们填写的属性是close=")"

separator:多个条件拼接时的分隔符,我们知道in语句中会有多个条件即in(1,2,3,4)而多个条件使用逗号分割,所以这里我们填写的属性是separator=","

在这里插入图片描述

最终效果

最后由控制台可以看出,我们已经成功拼接了and xxx in (?,?,?)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/745244.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot + WebSocket+STOMP指定推送消息

目录 一、前提条件1.2 环境要求1.3 依赖 二、相关工具类准备2.1 发送消息载体2.2 接收消息载体2.3 消息处理接口2.4 为 STOMP 消息传递配置 Spring 三、前端部分四、效果 一、前提条件 本文将简单的描述SpringBoot WebSocketSTOMP指定推送消息场景&#xff0c;不包含信息安全加…

搭建FRP内网穿透服务器来远程访问本地windows/linux中的web服务

什么是FRP&#xff1f; FRP 是一个免费开源的用于内网穿透的反向代理应用&#xff0c;它支持 TCP、UDP 协议&#xff0c; 也为 http 和 https 协议提供了额外的支持。 FRP有服务端和客户端&#xff0c;你将服务端安装在你买的便宜云服务器上&#xff0c;FRP客户端安装在你自己的…

数据标注是什么?

关于数据标注您需要了解的一切——专家解答&#xff1a;澳鹏产品管理总监Meeta Dash 人工智能&#xff08;AI&#xff09;的质量取决于对其予以训练所使用的数据。由于训练数据的质量和数量直接决定AI算法的成败&#xff0c;因此&#xff0c;对于一个AI项目&#xff0c;平均80…

简单线性回归评估指标+R Squared

使得每一个数据集尽可能的小 均方误差MSE&#xff1a;&#xff08;平方和取平均值&#xff09; 均方根误差RMSE&#xff1a;&#xff08;平方和取平均值开根号&#xff09;&#xff1a;平均误差值 平均绝对误差MAE&#xff1a;&#xff08;绝对值取平均&#xff09;&#xff1a…

Misc题目总结

目录 [WUSTCTF2020]girlfriend 手机键盘隐写&#xff1a; [GUET-CTF2019]zips setup.sh文件的运行方法&#xff1a; [MRCTF2020]千层套路 重复解zip加密压缩包脚本&#xff1a; 根据RGB坐标构造二维码脚本&#xff1a; [DDCTF2018](╯□&#xff09;╯︵ ┻━┻ [WUSTC…

COT、COT-SC、TOT 大预言模型思考方式||底层逻辑:prompt设定

先讲一下具体缩写的意思 COT-chain of thoughts COT-SC (Self-consistency) Tree of thoughts:Deliberate problem solving with LLM 我理解其实不复杂 1. 最简单的是&#xff1a;直接大白话问一次 &#xff08;IO&#xff09; 2. 进阶一点是&#xff1a;思维链&#xff0c;…

wx.getUserProfile too frequently 问题

接口调用频率规范 概念介绍 小程序wx接口可分为“普通接口”和“限频接口”。 “限频接口”指的是一个用户在一段时间内不允许频繁调用的wx接口&#xff0c;此类接口一般会调用到微信后台系统资源&#xff0c;为了保护系统&#xff0c;同时防止用户资源被滥用&#xff0c;开…

C语言进阶之字符串函数和内存函数的介绍及部分函数的模拟实现

字符串函数和内存函数 1.字符串函数介绍1.1 strlen1.2 strcpy1.3 strcat1.4 strcmp1.5 strncpy1.6 strncat1.7 strncpy1.8 strstr1.9 strtok1.10 strerror1.11 字符分类函数 2.内存函数2.1 memcpy2.2 memmove2.3 memcmp 3.函数的模拟实现3.1 模拟实现strlen3.2 模拟实现strcpy3…

2023年上半年鲁大师手机流畅排行榜:OPPO Find X6 Pro稳居榜首,iQOO Neo8 Pro紧随其后

随着科技的不断进步&#xff0c;手机的流畅性在用户选择手机时也变得越来越重要。 在2023年上半年的手机流畅排行榜中&#xff0c;OPPO Find X6 Pro以219.98的得分稳居榜首。紧随其后的是iQOO Neo8 Pro&#xff0c;得分为219.73。 接下来&#xff0c;让我们一起来看看这份排行榜…

小白白也能学会的 PyQt 教程 —— 实战简易计算器

文章目录 导言一、从 0 到 1&#xff1a;简易计算器实现1、功能实现2、代码分析3、实现效果 二、由简入繁&#xff1a;优化简易计算器的 UI1、开始布局2、实现 Driver3、Driver 代码4、效果展示 总结 导言 PyQt5 是一个用于创建桌面应用程序的 Python 库&#xff0c;它提供了丰…

JavaWeb 拦截器(interceptor)和过滤器(filter)的区别 总结

一、区别 实现原理使用和适用范围使用场景触发时机请求顺序 二、具体展开说明 2.1 实现原理 过滤器Filter &#xff1a;基于函数也就是方法回调来完成拦截和放行的操作。 拦截器(interceptor)&#xff1a;拦截器则是通过Java 反射机制&#xff08;动态代理&#xff09;来实…

python_寻找底部股票

目录 写在前面&#xff1a; 下面开始进入正文&#xff0c;正文很长&#xff0c;先概述要点步骤&#xff0c;以防迷路。 先看最终结果&#xff08;当前价格为2023-07-10收盘价&#xff09; 1 下载股票基本信息、股票日数据 step one step two 2 从股票日数据中提取股票月数…

优思学院|如何衡量六西格玛中解决方案的有效性?

当你遇到任何质量问题&#xff0c;不论你使用的PDCA或者是六西格玛DMAIC策略&#xff0c;(1) 你都需要测量当前绩效&#xff0c;(2) 分析其原因&#xff0c;以至其根本原因&#xff0c;(3) 进行方案的试行、假设检验来进行验证&#xff0c;这就是解问题的必须步骤。 除了假设检…

计网笔记--运输层(vital)

1--运输层概述 运输层的任务&#xff1a; 为运行在不同主机上的应用进程提供直接的通信服务&#xff1b; 运输层为应用层提供了两种不同的运输协议&#xff1a; 面向连接的 TCP 和无连接的 UDP 协议&#xff1b; 2--端口号、复用与分用的概念 端口号&#xff1a; 端口号用于区分…

交互式绘图程序(MFC) 绘图例子

交互式绘图程序(MFC) 绘图例子 如需要项目源码&#xff0c;可自行下载 交互式绘图程序(MFC)GandyDraw-MFC项目源码-C#文档类资源-CSDN文库https://download.csdn.net/download/m0_71122770/87982379

Django实现简单的音乐播放器 4

在原有音乐播放器功能基础上&#xff0c;增加上传音乐功能。 效果&#xff1a; 目录 配置上传路径 配置路由 视图处理歌曲 引入类库 保存歌曲文件 模板上传 设置菜单列表 设置菜单列表样式 脚本设置 上传效果 1.显示菜单列表 2.点击上传歌曲 3.上传完成 4.查看保…

Python批量读取csv(xlsx)文件指定表头获取内容(表头可乱序)

程序背景 我们在日常办公中经常会遇到去csv或者excel文件中去剪切自己需要的列&#xff0c;然后重新粘贴在新的文件中&#xff0c;但是这样的工作方式非常的耗时&#xff0c;且效率低下&#xff0c;那么是否有一种方法&#xff0c;只要我提供表头就可以快速将我需要的表头生成一…

刚刚出炉!速看7月编程语言排行榜!

2023年已经过半&#xff0c;最新一期的编程语言排行榜你看了吗&#xff1f;刚刚&#xff0c;全球知名编程语言社区TIOBE公布了7月榜单&#xff0c;和播妞一起来看吧&#xff01; TIOBE 7 月 TOP 15 编程语言&#xff1a; 详细榜单可参考官网&#xff1a; https://www.tiobe.co…

超越廉价: 制造一种稀缺性,产品/服务本身具有一种不可复制、与众不同的特性。

文章目录 I 超越廉价1.1 培养自己的稀缺性1.2 为核心客户提供一些价值I 超越廉价 制造一种稀缺性,产品/服务本身具有一种不可复制、与众不同的特性。 时效性:具有时效性的东西天然具有不可复制的特性直播的时效性是重播不可替代的地方人的技能也是有时效性的,当满大街都是某…

最大正方形(力扣)暴力 + 动态规划 JAVA

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“…