mybatis的XML,如何多值匹配,支持单值(=)和多值(IN)查询

单个值匹配的 solutionType 拓展成支持单个值等于匹配、多值逗号分隔时 IN 匹配的逻辑,和之前的 stage 写法保持一致即可,我直接给你改造好的完整 xml 片段,可直接复制使用:

xml

XML 复制代码
<if test="rehabRecord.solutionType != null and rehabRecord.solutionType != ''">
    <choose>
        <!-- 多值:逗号分隔时,用IN匹配,使用$取值(因为IN后是多个值,不能加引号) -->
        <when test="rehabRecord.solutionType.indexOf(',') > -1">
            AND rr.solution_type IN (${rehabRecord.solutionType})
        </when>
        <!-- 单值:直接等于匹配,使用#取值(防SQL注入) -->
        <otherwise>
            AND rr.solution_type = #{rehabRecord.solutionType}
        </otherwise>
    </choose>
</if>

关键注意点(和 stage 逻辑一致,重点强调)

  1. 取值方式区分IN 后用 ${} 取值,因为逗号分隔的多值(如1,2,3)需要直接拼接成IN (1,2,3),用#{}会被加单引号变成IN ('1,2,3'),导致查询错误;单值时必须用#{},防止 SQL 注入。
  2. 判空逻辑保留 :外层if依然校验solutionType非空、非空字符串,避免无效的 SQL 拼接。
  3. 方法兼容indexOf(',') > -1 是 MyBatis 中 OGNL 表达式的写法,能正确判断字符串是否包含逗号,和之前 stage 的判断逻辑完全一致,无需额外修改。

拓展优化(可选,处理边界情况)

如果担心前端传参时出现首尾空格、多个连续逗号 (如1,2 ,3,,),可以在 Java 代码层对solutionType做预处理(trim + 去重逗号),保证拼接的 SQL 合法性,示例 Java 代码:

java

运行

复制代码
if (rehabRecord.getSolutionType() != null) {
    // 去除首尾空格,替换多个连续逗号为单个
    String solutionType = rehabRecord.getSolutionType().trim().replaceAll(",+", ",");
    rehabRecord.setSolutionType(solutionType);
}

这样改造后,solutionType2时走=匹配,传1,2,3时走IN匹配,和之前stage的使用体验完全一致。

相关推荐
敲个大西瓜13 天前
mybatis拦截器插件实现数据库字段加解密
mybatis
tianyuanwo13 天前
深入解析 RISC-V 虚拟化中的 UEFI 固件配置:从 XML 到 NVRAM 的生命周期管理
xml·linux·risc-v
武子康13 天前
Java-28 深入浅出 Spring 实现简易Ioc-04 在上节的业务下手动实现AOP
java·后端·mybatis
一条泥憨鱼13 天前
苍穹外卖【day6|微信登录与商品浏览功能】
后端·mybatis·苍穹外卖
vx-Biye_Design13 天前
springboot安阳地区研学旅游服务小程序-计算机毕业设计源码12785
java·vue.js·windows·spring boot·tomcat·maven·mybatis
摇滚侠13 天前
MyBatis+Spring+SpringMVC SSM 整合 179-185
java·spring·mybatis
摇滚侠13 天前
MyBatis+Spring+SpringMVC SSM ContextLoaderListener 177-178
java·spring·mybatis
Spring小子14 天前
【Spring Boot + Vue + DeepSeek】从零打造一个AI驱动的智能健康分析系统
java·spring boot·mybatis
武子康14 天前
Java-27 深入浅出 Spring - 实现简易Ioc-03 在上节的业务下手动实现IoC 从 XML 配置到 BeanFactory 反射注入
java·后端·mybatis