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