当前位置: 首页 > news >正文

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录

  • 前言
  • 1. 探讨
  • 2. 基本知识
  • 3. 总结

前言

🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF

基本的Java知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

使用MyBatis-Plus或直接操作SQL时,处理空值(NULL)和空字符串(“”)经常引发混淆和问题

通过实战的踩坑方式,将详细分析为何 yard_location IS NULL 和 yard_location = NULL 会返回不同结果,以及在 MyBatis-Plus 中如何正确使用 isNull 方法来查询空值

1. 探讨

什么是 NULL?

NULL 表示数据库中没有值,是一种特殊的标记。它与空字符串(“”)或数字 0 是不同的

如何查询 NULL?

查询字段是否为 NULL 应使用 IS NULL 或 IS NOT NULL
yard_location = NULL 是无效的,任何值与 NULL 比较(如 =、!=)都返回 UNKNOWN,即不匹配任何结果

那么结合Sql代码以及Mybatisplus中的语句进行探讨

SQL 查询:为何结果不同?

正确查询方式,返回 yard_location 为 NULL 的记录:SELECT * FROM dangerous_goods_log WHERE yard_location IS NULL;

错误查询方式,永远返回空结果,因为 = NULL 是不合法的比较:SELECT * FROM dangerous_goods_log WHERE yard_location = NULL;

接下来就是代码的重点了:

MyBatis-Plus 查询:为何 .eq(“yard_location”, “”) 返回空数据?

MyBatis-Plus 中,eq(“yard_location”, “”) 生成的 SQL 类似于:

SELECT * FROM `dangerous_goods_log` WHERE yard_location = '';

这会查询 yard_location 为 空字符串 的记录,而不是 NULL
如果数据库中 yard_location 为 NULL 而非 “”,此查询将不匹配任何结果

如果使用 .isNull("yard_location"),则生成的 SQL 为:

SELECT * FROM `dangerous_goods_log` WHERE yard_location IS NULL;

这是正确查询 NULL 的方式,因此返回正确结果

2. 基本知识

MyBatis-Plus 提供了 isNull 和 isNotNull 方法,用于处理 NULL 值的查询条件

isNull:用于查询字段值为 NULL 的数据

.isNull("字段名")

isNotNull:用于查询字段值非 NULL 的数据

.isNotNull("字段名")

基本的查询示例如下:

  1. 查询字段值为 NULL 的记录
List<GoodsLogDO> goodsLogs = goodsLogMapper.selectList(new QueryWrapper<GoodsLogDO>().isNull("yard_location") // 查询 yard_location 为 NULL 的记录.in("dangerous_goods_status", 0L, 1L) // 状态为 0 或 1
);

生成的 SQL:

SELECT * FROM `dangerous_goods_log` 
WHERE yard_location IS NULL AND dangerous_goods_status IN (0, 1);
  1. 查询字段值非 NULL 的记录
List<GoodsLogDO> goodsLogs = goodsLogMapper.selectList(new QueryWrapper<GoodsLogDO>().isNotNull("yard_location") // 查询 yard_location 非 NULL 的记录.eq("dangerous_goods_status", 0L) // 状态为 0
);

生成的 SQL:

SELECT * FROM `dangerous_goods_log` 
WHERE yard_location IS NOT NULL AND dangerous_goods_status = 0;

实战中的处理方式如下:

在这里插入图片描述

  1. 查询字段为空字符串或 NULL 的记录
List<GoodsLogDO> goodsLogs = goodsLogMapper.selectList(new QueryWrapper<GoodsLogDO>().and(wrapper -> wrapper.isNull("yard_location") // yard_location 为 NULL.or().eq("yard_location", "") // 或为空字符串).eq("dangerous_goods_status", 1L); // 状态为 1
);

生成的 SQL:

SELECT * FROM `dangerous_goods_log` 
WHERE (yard_location IS NULL OR yard_location = '') AND dangerous_goods_status = 1;

3. 总结

上述知识点,主要是明白一个知识点

  • 区分 NULL 和空字符串
    在数据库中,NULL 和 “” 是不同的。如果需要同时查询两种情况,必须显式使用 IS NULL 和 = 条件

  • MyBatis-Plus 默认行为
    MyBatis-Plus 不会自动将空字符串(“”)视为 NULL

  • SQL 默认比较规则
    避免使用 = NULL 或 != NULL,改用 IS NULL 或 IS NOT NULL

  • 空值赋值处理
    插入数据时,如果字段需要为空,应显式插入 NULL 而非 “”,以确保查询逻辑一致

相关文章:

MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势

目录 前言1. 探讨2. 基本知识3. 总结 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#x…...

RabbitMQ个人理解与基本使用

目录 一. 作用&#xff1a; 二. RabbitMQ的5中队列模式&#xff1a; 1. 简单模式 2. Work模式 3. 发布/订阅模式 4. 路由模式 5. 主题模式 三. 消息持久化&#xff1a; 消息过期时间 ACK应答 四. 同步接收和异步接收&#xff1a; 应用场景 五. 基本使用 &#xff…...

Python球球大作战

系列文章 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码8Python普通的玫瑰花代码9Python炫酷的玫瑰花代码10Python多…...

入侵他人电脑,实现远程控制(待补充)

待补充 在获取他人无线网网络密码后&#xff0c;进一步的操作是实现入侵他人电脑&#xff0c;这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址&#xff08;通过伪造的网页、伪造的Windows窗口、hook&#xff0c;信…...

数据分析实战—IMDB电影数据分析

1.实战内容 1.加载数据到movies_df&#xff0c;输出前5行&#xff0c;输出movies_df.info(),movies_df.describe() # &#xff08;1&#xff09;加载数据集&#xff0c;输出前5行 #导入库 import pandas as pd import numpy as np import matplotlib import matplotlib.pyplo…...

Google guava 最佳实践 学习指南之08 `BiMap`(双向映射)

guava 最佳实践 学习指南 Google Guava 库中的 BiMap&#xff08;双向映射&#xff09;是一种特殊的映射类型&#xff0c;它维护了映射的反向视图&#xff0c;并确保不存在重复值&#xff0c;且始终可以安全地使用值获取对应的键。以下是关于 Guava BiMap 的一些介绍和用法&am…...

【设计模式】空接口

&#xff08;空&#xff09;接口的用法总结 接口用于定义某个类的特定能力或特性。在工作流或任务管理系统中&#xff0c;接口可以帮助标识哪些任务可以在特定阶段执行。通过实现这些接口&#xff0c;任务类可以被标识为在相应的阶段可以执行&#xff0c;从而在验证和执行逻辑…...

Grad-CAM-解释CNN决策过程的可视化技术

Grad-CAM&#xff08;Gradient-weighted Class Activation Mapping&#xff09;是一种用于解释卷积神经网络&#xff08;CNN&#xff09;决策过程的可视化技术。其核心思想是通过计算分类分数相对于网络确定的卷积特征的梯度&#xff0c;来识别图像中哪些部分对分类结果最为重要…...

前后端学习中本周遇到的内容

一、RequiresPermissions注解 例如&#xff1a; RequiresPermissions("demo:staff:save") void saveStaff(); 权限控制&#xff0c;要求含有demo:staff:save的权限才能执行方法saveStaff()。 二、遇到的细节问题 在进行增删改查时&#xff0c;发送http请求时&…...

基于海思soc的智能产品开发(巧用mcu芯片)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于开发车规级嵌入式软件的同学来说&#xff0c;socmcu这样的组合&#xff0c;他们并不陌生。但是传统的工业领域&#xff0c;比如发动机、医疗或…...

批量DWG文件转dxf(CAD图转dxf)——c#插件实现

此插件可将指定文件夹及子文件夹下的dwg文件批量转为dxf文件。 &#xff08;使用方法&#xff1a;命令行输入 “netload” 加载插件&#xff0c;然后输入“dwg2dxf”运行&#xff0c;选择文件夹即可。&#xff09; 生成dxf在此新建的文件夹路径下&#xff0c;包含子文件夹内的…...

flask flask-socketio创建一个网页聊天应用

应用所需环境&#xff1a; python 3.11.11 其他 只需要通过这个命令即可 pip install flask3.1.0 Flask-SocketIO5.4.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 最好是用conda创建一个新的虚拟环境来验证 完整的pip list如下 Package Version ----…...

使用CNN模型训练图片识别(键盘,椅子,眼镜,水杯,鼠标)

首先是环境&#xff1a; 我是在Anaconda3中的Jupyter Notebook (tensorflow)中进行训练&#xff0c;环境各位自行安装 数据集&#xff1a; 本次数据集五个类型&#xff08;键盘&#xff0c;椅子&#xff0c;眼镜&#xff0c;水杯&#xff0c;鼠标&#xff09;我收集了每个接近两…...

Gitlab 数据备份全攻略:命令、方法与注意事项

文章目录 1、备份命令2、备份目录名称说明3、手工备份配置文件3.1 备份配置文件3.2 备份ssh文件 4、备份注意事项4.1 停止puma和sicdekiq组件4.2 copy策略需要更多磁盘空间 5、数据备份方法5.1 docker命令备份5.2 kubectl命令备份5.3 参数说明5.4、选择性备份5.5、非tar备份5.6…...

Vue|scoped样式

在 Vue.js 中&#xff0c;scoped 是一个非常有用的特性&#xff0c;允许你将样式限制在当前组件的作用域内&#xff0c;避免样式泄漏到其他组件。它是通过 Vue 的单文件组件&#xff08;.vue 文件&#xff09;中的 <style> 标签实现的。 目录 案例演示创建多个vue文件如何…...

eBPF试一下(TODO)

eBPF程序跟踪linux内核软中断 eBPF (Extended Berkeley Packet Filter) 是一种强大的 Linux 内核技术&#xff0c;最初用于网络数据包过滤&#xff0c;但现在它已经扩展到了多个领域&#xff0c;如性能监控、安全性、跟踪等。eBPF 允许用户在内核中执行代码&#xff08;以一种安…...

【数据安全】如何保证其安全

数据安全风险 数字经济时代&#xff0c;数据已成为重要的生产要素。智慧城市、智慧政务的建设&#xff0c;正以数据为核心&#xff0c;推动城市管理的智能化和公共服务的优化。然而&#xff0c;公共数据开放共享与隐私保护之间的矛盾日益凸显&#xff0c;如何在确保数据安全的…...

[创业之路-196]:华为成功经验的总结与教训简单总结

目录 前言&#xff1a; 成功经验 教训归纳 前言&#xff1a; 华为作为世界领先的通信设备制造商&#xff0c;其成功经验与教训值得深入探讨。 以下是对华为成功经验的总结与教训的归纳&#xff1a; 成功经验 战略定位明确&#xff1a; 华为始终坚持“死死抓住核心技术”…...

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…...

【UE5】pmx导入UE5,套动作。(防止“气球人”现象。

参考视频&#xff1a;UE5Animation 16: MMD模型與動作導入 (繁中自動字幕) 问题所在&#xff1a; 做法记录&#xff08;自用&#xff09; 1.导入pmx&#xff0c;删除这两个。 2.转换给blender&#xff0c;清理节点。 3.导出时&#xff0c;内嵌贴图&#xff0c;选“复制”。 …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...

java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟

众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了&#xff0c;延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp &#xff0c;边缘服务器拉流推送到云服务器 …...