mybatis的sql中,如果一个条件column=#{column},column的值为null时,会不会匹配出column is null 的记录

在 MyBatis 的 SQL 映射文件中,当你使用 column = #{column}这种写法,并且传入的参数 column的值为 null时,​不会 匹配出 column IS NULL的记录。

原因如下:

  1. ​SQL 语义:​​

    • column = NULL在 SQL 中是一个无效的比较。在 SQL 标准中,任何值与 NULL进行比较(使用 =、<>、<、>等)的结果都是 UNKNOWN(不是 TRUE)。因此,column = NULL这个条件永远不会为 TRUE,也就不会返回任何行。

    • 要检查一个列是否为 NULL,必须使用专门的 IS NULL操作符。

  2. ​MyBatis 的参数替换:​​

    • MyBatis 在执行 SQL 语句之前,会使用 JDBC 的 PreparedStatement进行参数替换。

    • 当参数 #{column}的值为 null时,MyBatis 会将其替换为 JDBC 的 NULL值(即 setNull(...))。

    • 最终发送到数据库的 SQL 语句看起来像这样:... WHERE column = NULL ...。

    • 正如第 1 点所述,column = NULL在 SQL 中是不起作用的。

​结果:​​

  • 当 column参数为 null时,column = #{column}这个条件相当于 column = NULL。

  • column = NULL在 SQL 中总是求值为 UNKNOWN。

  • 因此,​该条件不会匹配任何行,包括那些 column IS NULL的行。​​

​如何正确匹配 NULL?​​

如果你希望在参数为 null时匹配 column IS NULL的记录,你需要使用 MyBatis 的动态 SQL 功能(通常是 <if>标签)来改变 SQL 语句的结构:

复制代码
<select id="findByColumn" resultType="YourResultType">
  SELECT * FROM your_table
  <where>
    <if test="column != null">
      column = #{column}
    </if>
    <if test="column == null">
      column IS NULL
    </if>
  </where>
</select>

​

  • <where>标签会智能地处理 WHERE关键字和 AND/OR的连接问题。

  • 第一个 <if test="column != null">:当参数 column的值不为 null时,生成 column = #{column}条件。

  • 第二个 <if test="column == null">:当参数 column的值为 null时,生成 column IS NULL条件。

这样,无论参数 column是具体的值还是 null,你都能正确地查询到期望的记录:

  • 传入非 null值:匹配该值的记录。

  • 传入 null:匹配 column IS NULL的记录。

​在 MyBatis 中,直接使用 column = #{param}且 param为 null时,不会匹配 column IS NULL的记录。必须使用动态 SQL(如 <if>)根据参数值动态生成 = value或 IS NULL条件才能实现预期的查询行为。

相关推荐
herinspace13 小时前
管家婆实用贴-SQL 2008如何修改成混合模式
服务器·数据库·sql·管家婆软件·财务软件·合肥管家婆软件
真上帝的左手14 小时前
30. 技术专题-‌应用框架组件-关系型数据库-MySQL-Mybatis
数据库·分布式·mysql·中间件·mybatis
大模型最新论文速读16 小时前
text-to-sql:从学术玩具到生产落地
数据库·sql
Decay__17 小时前
15_MySQL 数据同步与迁移方案 —— 复制 / DataX / Canal / 异构同步(对标 Oracle GoldenGate)
运维·数据库·sql·mysql·架构
zjx238817 小时前
oracle11g转Gbase8s库SQL常见问题修改
数据库·sql
雪芽蓝域zzs17 小时前
第 2 章:整合 MySQL + MyBatis,搭建数据库基础、实体类、Mapper、测试查询
数据库·mysql·mybatis
杨云龙UP18 小时前
Oracle 同义词(SYNONYM)详解及 Toad for Oracle SQL 智能补全配置实战
运维·数据库·sql·oracle·同义词·toad·toad for oracle
Decay__19 小时前
17_MySQL 监控体系构建 —— mysqld_exporter + Prometheus + Grafana 全栈实战
运维·数据库·sql·mysql·架构
梅孔立20 小时前
Docker 容器网络不通:Tomcat 无法解析 MySQL、Nginx 无法反代 Tomcat 的生产级排查与治理
网络·docker·tomcat
w-w0w-w1 天前
SQL注入
网络·数据库·sql