问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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而非“”,以确保查询逻辑一致。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号