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>

查询结果:
Mybatis中使用foreach遍历Map实现多条件查询_第1张图片
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的书写,如果可以在熟练使用各类查询标签之后,灵活的进行结合可以达到事半功倍的效果!

你可能感兴趣的:(mybatis,java,xml)