MyBatis中xml文件参数为map时高级用法

MyBatis中xml文件参数为map时高级用法

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

下面是使用场景

假设前端将许多的参数以Vo的形式传入,我们在Service蹭、Mapper层都传入Vo,我们在xml中就需要对多个查询参数进行判空,比如下面这样:

1
2
3
4
5
6
7
8
9
10
11
12
<select id = "testXml" paramsType = "xxx.xxx.Vo" resultType = "xxx.xxx.Vo">
select xxx
from db.table
<where>
<if test="null != param1">
xxx = #{xxx}
</if>
<if test="null != param2">
xxx = #{xxx}
</if>
</where>
</select>

这种方式实现没有问题,但是有一个小小的弊端就是如果查询参数很多的话,那就要写很多很多的if标签,那么有没有一种类似于循环判断的方式从而不用写那么多if呢?当然有!

在Service层里面将Vo转成Map后传入Mapper层即可,具体实现如下:

这是Service层

1
2
3
4
5
public List<UserDepte> getByMap(UserQueryParams params){
Map<String,String> paramsMap= new HashMap<String, String>();
paramsMap.put("key", params.getXxx());
return this.getByMap(paramsMap);
}

这是Mapper层

1
int getByMap(@param("paramsMap") Map<String,Object> map)

这是对应的XML文件

1
2
3
4
5
<foreach collection="paramsMap.keys" item="k" separator=",">   
<if test="null != paramsMap[k]">
${k} = #{paramsMap[${k}]}
</if>
</foreach>

这样就一个循环解决参数判空的问题,而不再需要写一堆if

Author: Aaron
Link: https://xjsir.cn/2023/03/05/MyBatis中XML文件参数为map时高级用法/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.