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

版权声明:本文为【丶我们一起学猫叫】原创文章,允许转载,但转载必须注明出处并附带首发链接! https://blog.csdn.net/AV_woaijava/article/details/89395552

一直以来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>
    

猜你喜欢

转载自blog.csdn.net/AV_woaijava/article/details/89395552
今日推荐