【Mybatis】动态SQL之 foreach 标签解析Map对象

一直以来DAO层就是用的Mybatis,写过的动态sql也不少,不过每次爬完坑之后都没有形成有效的笔记总结
这一次又爬了一个使用foreach标签解析Map<String, List<Object>>的坑,那就记录下来吧,也方便以后学习翻阅!

解析 Map<String, List<Object>>

上菜:

  • 需求:通过性别年龄来查询用户(两个都能多选)
    在这里插入图片描述

  • 格式:{"sex":[], "age":[]},如:{"sex":['男'], "age":[23, 24, 27, 30]}

  • DAO接口:List getUser(Map<String, List> mapFilterCondition);

  • XML文件SQL

    <!--
    	id值与DAO接口的方法名对应 
    	select语句时,必须要指定返回值类型
    -->
    <select id="getUser"   resultType="top.peng.User">
    SELECT age, sex, phone, email, address
    FROM user
    	<!-- 使用where标签,可以在sql的拼接时做一些容错处理 -->
    	<where>
    		<!-- 
    			解析Map<String, List<Object>>的参数,需要用到两层foreach标签,外层遍历map得到key,内层遍历value得到list的每一项
    			collection="mapFilterCondition.keys":遍历map的key,keys是固定的
    			item="key"返回的是key
    		-->
    		<foreach collection="mapFilterCondition.keys" open=" and " item="key" index="index" separator="or">
    			( 
    				<!--
    					注意这里和String类型判断相等,需要做处理 
    					使用toString()方法进行转换 
    				-->
    				<if test="key=='sex'.toString()">
    					<foreach collection="mapFilterCondition[key]" open="sex in(" close=")" separator="," item="sex">
    						#{sex}
    					</foreach>
    				</if>
    				<if test="key=='age'.toString()">
    				<foreach collection="mapFilterCondition[key]" open="age in(" close=")" separator="," item="age ">
    					#{age }
    				</foreach>
    				</if>
    			)
    		</foreach>
    		<!-- 最后这里有一个and,但是是被where标签包裹的,如果前面是连接的where,and会被过滤掉 -->
    		and delete_flag='未删除'
    	</where>
    </select>
    
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值