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而非“”,以确保查询逻辑一致。
热门推荐
停车场区域如何使用红绿灯?
从“小姐”到“小姐姐”:中国女性的称呼里,藏着时代的DNA
揭开宇宙的“暗面”:欧几里得望远镜发布首张宇宙地图
水飞蓟的种植方法与技术
踏板摩托车的油门控制方法是什么?这种控制方法对行驶安全有何影响?
宋词中“大雁”的隐喻研究
解读齐文化:齐宣王与他开创的盛世
六本非常经典的机甲流小说,背景世界非常宏大,诠释了男人的浪漫
如何用一周的时间学完C语言
如何实施社会性科学议题实践活动
新能源车,一边充电一边开空调:用的是哪里的电?
厦门租房攻略:厦门租房哪里划算
泰狮和百褶泰狮有何区别,前者尾巴多变、后者尾巴就像百褶裙
应急科普:天然气安全使用指南
倭马亚王朝的兴衰:社会矛盾与文化辉煌
倭马亚王朝的兴衰:社会矛盾与文化辉煌
2024年北京市生物医药产业发展梳理
电脑机箱尺寸全解析:选择合适的机箱,让硬件安家无忧!
测量血压的正确方法:避免走入误区
加利福尼亚州的假日风情画:法定假期的多元文化体验
加州留学一年生活费用是多少
口腔溃疡吃哪种维生素好
桔子树开花时间及结果的形成(探究桔子树开花的条件及影响因素)
恶意拖欠工资强制措施有哪些
榴莲鸡汤:舌尖经济下的秋冬滋补新宠
榴莲怎么吃?从入门到精通的食用指南,解锁多种美味吃法
没有不伴随权力的知识,也没有不包含知识的权力
两侧铲短微分碎盖:年轻男生的时尚发型之选
数据生命周期管理:从提取到治理再到安全保障的全面策略
哪种睡姿对颈椎和腰椎有益,不使用枕头是否好