MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势
创作时间:
作者:
@小白创作中心
MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势
引用
CSDN
1.
https://m.blog.csdn.net/weixin_47872288/article/details/144519247
在使用MyBatis-Plus或直接操作SQL时,处理空值(NULL)和空字符串(“”)经常引发混淆和问题。本文将通过实战的踩坑方式,详细分析为何yard_location IS NULL和yard_location = NULL会返回不同结果,以及在MyBatis-Plus中如何正确使用isNull方法来查询空值。
前言
什么是NULL?NULL表示数据库中没有值,是一种特殊的标记。它与空字符串(“”)或数字0是不同的。
如何查询NULL?查询字段是否为NULL应使用IS NULL或IS NOT NULL。yard_location = NULL是无效的,任何值与NULL比较(如=、!=)都返回UNKNOWN,即不匹配任何结果。
接下来,让我们结合SQL代码以及MyBatis-Plus中的语句进行探讨。
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的方式,因此返回正确结果。
基本知识
MyBatis-Plus提供了isNull和isNotNull方法,用于处理NULL值的查询条件。
- isNull:用于查询字段值为NULL的数据
- isNotNull:用于查询字段值非NULL的数据
基本的查询示例如下:
查询字段值为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);
查询字段值非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;
实战中的处理方式
查询字段为空字符串或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;
总结
上述知识点,主要是明白一个知识点:
- 区分NULL和空字符串:在数据库中,NULL和“”是不同的。如果需要同时查询两种情况,必须显式使用IS NULL和=条件。
- MyBatis-Plus默认行为:MyBatis-Plus不会自动将空字符串(“”)视为NULL。
- SQL默认比较规则:避免使用= NULL或!= NULL,改用IS NULL或IS NOT NULL。
- 空值赋值处理:插入数据时,如果字段需要为空,应显式插入NULL而非“”,以确保查询逻辑一致。
热门推荐
乔木胸径:定义、测量方法与应用领域解析
颧骨痛什么原因
5万新生同上人工智能通识课!北京市属公办高校打造AI教育“一校一品”
爱乐压操作方法和流程
如何练习气泡音?
如何挑选护眼旗舰手机?屏幕类型、调光方式及护眼技术一览
史上最简单的泡菜,泡白菜
异地组网后如何统一网络出口?
“妖股”鸿博股份业绩变脸,“牵线”英伟达的美女高管遭解聘!
STM32 F103C8T6 芯片有哪些重要引脚功能
85.8%受访家长认为加强中小学科学教育重要,建议创新教学方法
天冷了,要多吃香菜,加两个鸡蛋简单一炒,比肉还解馋
小腿外翻如何矫正?三种方法助你恢复健康步态
股票资金净流入的计算方法与投资指导意义
如何分辨气象灾害预警?一文看懂
二手车行驶证过户需要哪些二手续?过户时如何避免纠纷?
汽车漆面水印斑怎么洗掉
短期临时用工要签劳动合同吗
超强高效燃脂运动(超强高效燃脂运动方法)
“那一刻我们也是消防员”,顺义区两村民救火获表彰
鼻涕很黏是什麼原因?一次了解4個因素與改善方法
如何选择适合房屋面积的空调匹数?
詹姆斯16年季后赛全记录:6911分创历史,12次一阵彰显统治力
小区里的“僵尸车”难倒大活人
YOLOv11多模态目标检测:结合CFT模块融合可见光+红外光双输入
从源头入手,全面降血脂,最后一招绝对有效!
2025年低空经济大爆发:技术、政策、应用场景全面解析
2025年房贷LPR利率或将进一步下调
清水寺:京都最古老的木造建筑,世界文化遗产
Qt框架详解:模块组成与元对象系统