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而非“”,以确保查询逻辑一致。
热门推荐
立方米的定义、计算方法及实际应用详解
90后传承人陈郑墨:让温州灯盏糕焕发新生
江蟹生:温州小吃中的绝味海鲜
神奇的核能可不仅仅是发电,从农业、环保到医学领域,探索核电里的N种新质生产力
让人民满意,是他一生追逐的最高奖赏 | 科技史
双11错峰游成都!三大历史景点限时优惠攻略
成都冬游打卡:从宽窄巷子到锦里
跟着赵雷的歌去成都:从玉林路到九眼桥的一日游
科普 | 今年冬至,将是128年来最早的冬至!
096型核潜艇的崛起与国家安全的坚守
航天梦就是这样干出来的
深圳高交会上的智慧合杆黑科技
高血压治疗的六大误区,你踩中了几个?
智慧灯杆:环保新宠儿?
北京5G智慧灯杆:城市管理新利器
智慧路灯+5G微基站:新材料让城市更智能
冬季四川旅游打卡:九寨沟、黄龙、峨眉山
新疆昌吉市智慧合杆技术应用:机遇与挑战并存
客服排班系统如何提高客服人员的响应速度?
“每日三次”用药真的科学吗?
高血压患者如何掌握正确的药物服用频率?
iOS 16健康App用药提醒:让服药不再困扰
年轻人如何规划养老保险?商业保险这样选
酱炒鸡蛋,一道看似简单却充满家常味道的经典菜肴
女友抑郁症有自残怎么办
冰箱灯闪自修攻略:15种常见原因及解决方案
2024年“交通大学”排名大调整:上海交大稳居榜首,西南交大位列第四
北京发布智慧合杆新标,5G技术助力智慧城市升级
深圳智慧合杆:一根杆子如何改变城市生活?
智慧灯杆:守护城市信息安全的新宠儿