Mybatis中使用foreach遍历Map实现多条件查询

Mybatis中使用foreach遍历Map实现多条件查询

对于多条件查询,我们使用map存储所有的条件,但是我不想手动对所有的value进行判断是否为空,于是想到遍历map,但是搜遍了全网最终竟然告诉我mybatis中的foreach并不支持map的遍历?也有说可以的,但是代码拿过来测试的结果都是错误的,可这并不能阻止我实现自己的想法!

在多方尝试之后,我有了一个大胆的想法,在需要作为参数的map中加入该map自己所有的key,然后到xml中取出所有的key进行占位赋值,这样就可以遍历所有的value,也就是遍历所有的条件

// 多条件查询
Map<String,Object> map = new HashMap<>();
map.put("name","飞飞");
// 测试空格的去除
map.put("pwd","           ");
// 将map所有的key存入map
map.put("keys",map.keySet());
System.out.println(dao.getManyUserByMess(map));

xml中配置的具体实现:

<!-- 多条件查询用户 -->
<resultMap id="users" type="com.jql.pojo.User"></resultMap>
<select id="getManyUserByMess" parameterType="java.util.Map" resultMap="users">
    select * from `user`
    <where>
        <foreach collection="keys" item="key" >
            <if test='_parameter.get(key) != null
                      and _parameter.get(key).toString().trim() != ""
                      and key != "keys"'>
                and ${key} = #{${key}}
            </if>
        </foreach>
    </where>
</select>

查询结果:
在这里插入图片描述
Sql的优化:
在对_parameter进行深入的了解之后,我对之前的自己大胆尝试的sql进行了优化,

<!-- 多条件查询用户最终优化 -->
<resultMap id="users" type="com.jql.pojo.User"></resultMap>
<select id="getManyUserByMess" parameterType="java.util.Map" resultMap="users">
    select * from `user`
    <where>
        <foreach collection="_parameter" item="tm" index="key">
		    <if test='tm != null and tm.toString().trim() != ""'>
		    	and ${key} = #{tm}
		    </if>
		</foreach>
    </where>
</select>

在mybatis中,_parameter可用于接收传递过来的参数对象,在这里就是接收我传递的map,因此在foreach中index就是对应map的每个key,而item就是对应的value,这样一来整个sql就优化成了现在的形式,而且也不再需要手动将map所有的key进行存储,真正实现了foreach对map的遍历!

总结
多条件查询是实际应用中使用较多的查询之一,但是之前使用纯JDBC代码进行多条件查询的书写,十分繁琐,工作量浩大。如今在使用mybatis之后,通过结合xml的使用,极大的简化了sql的书写,如果可以在熟练使用各类查询标签之后,灵活的进行结合可以达到事半功倍的效果!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值