mybatis 中if标签内容 判断详解

MyBatis 的 <if> 标签通过 OGNL 表达式进行条件判断,支持丰富的逻辑和对象操作。以下是常见用法和注意事项的详细总结:


一、基本判断语法

xml 复制代码
<if test="条件表达式">
    SQL片段
</if>

二、常见判断场景

1. 简单值比较

  • 数字类型(无需引号):

    xml 复制代码
    <if test="age == 18"> ... </if>       <!-- 等于 -->
    <if test="age != 20"> ... </if>      <!-- 不等于 -->
    <if test="age gt 10"> ... </if>      <!-- 大于 -->
    <if test="age lt 30"> ... </if>      <!-- 小于 -->
  • 字符串类型(需单引号包裹):

    xml 复制代码
    <if test="status == 'ACTIVE'"> ... </if>    <!-- 字符串相等 -->
    <if test="status eq 'INACTIVE'"> ... </if>  <!-- eq 等效于 == -->
    <if test="status != 'DELETED'"> ... </if>

2. 对象属性判断

xml 复制代码
<if test="user.name != null"> ... </if>        <!-- 判断对象属性非空 -->
<if test="order.amount gt 100"> ... </if>      <!-- 嵌套属性判断 -->

3. 集合/数组判断

xml 复制代码
<if test="list != null and list.size() > 0"> ... </if>  <!-- 集合非空 -->
<if test="array.length > 0"> ... </if>                <!-- 数组非空 -->

4. 逻辑运算

xml 复制代码
<if test="(a == 1) or (b == 2)"> ... </if>     <!-- 逻辑或 -->
<if test="flag and !error"> ... </if>          <!-- 逻辑与、非 -->

5. 方法调用

xml 复制代码
<if test="name.toString() == 'admin'"> ... </if>          <!-- 调用toString -->
<if test="@com.example.StringUtils@isBlank(email)"> ... </if>  <!-- 调用静态方法 -->

三、特殊场景处理

1. 枚举类型判断

xml 复制代码
<!-- 假设枚举类型 Status 有 ACTIVE, INACTIVE -->
<if test="status.name() == 'ACTIVE'"> ... </if>    <!-- 使用 name() 获取枚举名 -->
<if test="status.toString() == 'ACTIVE'"> ... </if> <!-- 或 toString() -->

2. 避免空指针(Null Safety)

xml 复制代码
<!-- 先判空再调用方法 -->
<if test="user != null and user.isAdmin()"> ... </if> 

3. 布尔值判断

xml 复制代码
<if test="isDeleted"> ... </if>        <!-- 等效于 isDeleted == true -->
<if test="!isDeleted"> ... </if>       <!-- 等效于 isDeleted == false -->

4. 空字符串与 Null

xml 复制代码
<if test="name != null and name != ''"> ... </if>  <!-- 同时排除 null 和空字符串 -->

四、易错点及解决

1. 字符串比较陷阱

  • 错误示例 (比较对象地址):

    xml 复制代码
    <if test="status == ACTIVE"> ... </if>  <!-- 缺少单引号,OGNL 会解析为变量 -->
  • 正确写法

    xml 复制代码
    <if test="status == 'ACTIVE'"> ... </if>  <!-- 用单引号包裹字符串 -->

2. 数字类型与字符串隐式转换

  • 错误示例 (类型不匹配):

    xml 复制代码
    <if test="id == '1'"> ... </if>  <!-- id 是 Long 类型,比较会失败 -->
  • 正确写法

    xml 复制代码
    <if test="id == 1"> ... </if>    <!-- 去掉引号,确保类型一致 -->

3. 使用 toString() 的场景

  • 适用情况 :将非字符串类型转换为字符串比较。

    xml 复制代码
    <if test="id.toString() == '1001'"> ... </if>  <!-- 将 Long 转为 String -->

五、高级技巧

1. 使用工具类方法

xml 复制代码
<if test="@org.apache.commons.lang3.StringUtils@isNotBlank(name)">
  AND name = #{name}
</if>

2. 多条件组合

xml 复制代码
<where>
  <if test="name != null"> AND name = #{name} </if>
  <if test="age != null"> AND age = #{age} </if>
</where>

3. 动态 SQL 函数

xml 复制代码
<if test="_parameter.containsKey('keyword')">  <!-- 判断 Map 参数是否包含 key -->
  AND title LIKE CONCAT('%', #{keyword}, '%')
</if>

六、总结

  • 核心原则:确保 OGNL 表达式中的类型与 Java 对象一致。
  • 关键注意:字符串用单引号、数字无需引号、优先判空。
  • 灵活组合 :通过逻辑运算符 (and/or)、方法调用 (toString())、工具类等实现复杂逻辑。

通过合理使用 <if> 标签,可以轻松实现动态 SQL 的灵活拼接!

相关推荐
躲在云朵里`1 小时前
Spring Scheduler定时任务实战:从零掌握任务调度
java·数据库·mybatis
Java小白程序员1 天前
MyBatis基础到高级实践:全方位指南(中)
数据库·mybatis
山楂树下懒猴子1 天前
ChatAI项目-ChatGPT-SDK组件工程
人工智能·chatgpt·junit·https·log4j·intellij-idea·mybatis
Mr_hwt_1231 天前
基于mybatis-plus动态数据源实现mysql集群读写分离和从库负载均衡教程(详细案例)
数据库·spring boot·mysql·mybatis·mysql集群
Z_z在努力2 天前
【杂类】Spring 自动装配原理
java·spring·mybatis
little_xianzhong2 天前
关于对逾期提醒的定时任务~改进完善
java·数据库·spring boot·spring·mybatis
MadPrinter2 天前
SpringBoot学习日记 Day11:博客系统核心功能深度开发
java·spring boot·后端·学习·spring·mybatis
奔跑吧邓邓子2 天前
【Java实战㉟】Spring Boot与MyBatis:数据库交互的进阶之旅
java·spring boot·实战·mybatis·数据库交互
lunzi_fly2 天前
【源码解读之 Mybatis】【基础篇】-- 第1篇:MyBatis 整体架构设计
java·mybatis
摸鱼仙人~2 天前
深入理解 MyBatis-Plus 的 `BaseMapper`
java·开发语言·mybatis