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而非“”,以确保查询逻辑一致。
热门推荐
苹果手机信号差?真相竟是这样!
劳动与安全感:实现人生目标的基石
如何调整员工薪资方案以提高员工满意度?
创伤性前房积血
SCI论文写作指南:工程类论文的结论、摘要与题目
扬州深度游:3日精华之旅
如何读懂汽车配置表中的发动机参数?
湖南娄底:让优质医疗资源“动”起来“活”起来
高校食堂托管的营养配餐与健康促进
快速减脂有氧运动,快速减脂有氧运动方法
如何让孩子感觉自己被深爱?这4句话记得要常说
牛肉匙柄是哪个部位?匙柄"上下铺亲兄弟",被誉为"嫩中之嫩"
翡翠手串的佩戴方式:左右手的选择与注意事项详解
梦幻西游时空之隙力敏:探索力敏角色的加点策略与种族优势
食管溃疡:病因、症状、诊断与治疗全解析
公司CRM系统后台数据如何管理
每天都头疼的厉害是怎么回事
“博士”与“博士后”差距竟这么大?大学教授给出最佳解释!
博士和博士后的区别:定义、职责、发展路径全解析
计算机中的基本逻辑电路:原理与应用
MKV播放不了怎么办?5个简单有效的解决方法!
系统性硬化症的早期识别
多元化浪潮下,中国期刊杂志市场的创新与挑战!
应对手机信号不好的多种解决方案与心理调整建议
新国标电动车管理升级,百姓需求如何平衡?
SF6六氟化硫气体水分含量国家标准
晚上睡不着闭眼躺着,身体有在休息吗?
破裂风险可增加10倍!脑动脉瘤要“等一等”还是“尽早手术”?
A股调整之际,主力资金抄底电子行业!233亿元净流入,人形机器人概念爆发
潮汕鼠麯粿(鼠壳粿):传统美食里的文化记忆