mybatis传递多个不同类型的参数到mapper xml文件

在业务中查询某张表时需要设置多个查询条件,并且还要根据id列表进行权限过滤,这时推荐采用Map<String, Object>作为参数进行查询,因为:Object可以设置成不同的类型,比如:List<Integer> ids, Map<String, Object>

我们看一个例子:

XML 复制代码
<select id="getByParam" resultMap="CrowdManageResult" parameterType="java.util.Map">
    select <include refid="Base_Column_List"/>
    from t_crowd_manage where 1=1
    <if test="crowd.name != null">
        and name like concat('%',#{crowd.name, jdbcType=VARCHAR},'%')
    </if>
    <if test="crowd.type != null">
        and type = #{crowd.type, jdbcType=INTEGER}
    </if>
    <if test="crowd.status != null">
        and status = #{crowd.status, jdbcType=INTEGER}
    </if>
    <if test="crowd.noStatus != null">
        and status != #{crowd.noStatus, jdbcType=INTEGER}
    </if>
    <if test="ids != null and ids.size() > 0">
        and id in
        <foreach item="id" collection="ids" open="(" separator="," close=")">
            #{id, jdbcType=BIGINT}
        </foreach>
    </if>
    order by update_time desc
</select>

service层查询代码:

XML 复制代码
Map<String, Object> param = new HashMap<>(2);
Map<String, Object> crowdEntity = new HashMap<>(); // xml if 判断不会报错
crowdEntity.put("name", "test");
crowdEntity.put("type", 1);
crowdEntity.put("noStatus", -1);

Set<Integer> idList = //....

param.put("crowd", crowdEntity);
param.put("ids", idList);

注意:这个sql条件查询条件主要设计两个部分:

  1. 一般的查询条件,这里可以使用Bean对象,也可以使用map。推荐使用后者,因为在sql的条件中有一个noStatus字段判断,通常Bean定义的时候只有status字段(没有noStatus),如果这里使用定义Bean来当查询参数,在xml中<if test="crowd.noStatus != null"> 这句会报错。原因是mybatis的xml采用ONGI查询来解析,所以如果Bean中没有定义这个字段,就会报错。
  2. in条件查询,这里使用的是foreach
相关推荐
栈与堆8 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
一路向北·重庆分伦8 小时前
03-01:MQ常见问题梳理
java·开发语言
一 乐8 小时前
绿色农产品销售|基于springboot + vue绿色农产品销售系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·宠物
lhrimperial8 小时前
企业智能知识库助手落地实践:从RAG到Multi-Agent
java·spring cloud·微服务·系统架构·知识图谱
Codeking__8 小时前
Redis初识——什么是Redis
数据库·redis·mybatis
3***68848 小时前
Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程
java·spring boot·后端
C***u1768 小时前
Spring Boot问题总结
java·spring boot·后端
Elieal8 小时前
5 种方式快速创建 SpringBoot 项目
java·spring boot·后端
better_liang9 小时前
每日Java面试场景题知识点之-Java修饰符
java·访问控制·static·abstract·final·修饰符·企业级开发
rgeshfgreh9 小时前
Spring事务传播机制深度解析
java·前端·数据库