在 MyBatis 的 SQL 映射文件中,当你使用 column = #{column}这种写法,并且传入的参数 column的值为 null时,不会 匹配出 column IS NULL的记录。
原因如下:
- 
SQL 语义: - 
column = NULL在 SQL 中是一个无效的比较。在 SQL 标准中,任何值与NULL进行比较(使用=、<>、<、>等)的结果都是UNKNOWN(不是TRUE)。因此,column = NULL这个条件永远不会为TRUE,也就不会返回任何行。
- 
要检查一个列是否为 NULL,必须使用专门的IS NULL操作符。
 
- 
- 
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条件才能实现预期的查询行为。