赣州营销型网站策划,网站建设列表,wordpress网站存放在,定期报告系统下载官网目录 前言1. 探讨2. 基本知识3. 总结 前言 #x1f91f; 找工作#xff0c;来万码优才#xff1a;#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读#xff1a;
java框架 零基础从入门到精通的学习路线 附开源项目面经等#xff08;超全#x… 目录 前言1. 探讨2. 基本知识3. 总结 前言 找工作来万码优才 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读
java框架 零基础从入门到精通的学习路线 附开源项目面经等超全【Java项目】实战CRUD的功能整理持续更新
使用MyBatis-Plus或直接操作SQL时处理空值NULL和空字符串“”经常引发混淆和问题
通过实战的踩坑方式将详细分析为何 yard_location IS NULL 和 yard_location NULL 会返回不同结果以及在 MyBatis-Plus 中如何正确使用 isNull 方法来查询空值
1. 探讨
什么是 NULL NULL 表示数据库中没有值是一种特殊的标记。它与空字符串“”或数字 0 是不同的 如何查询 NULL 查询字段是否为 NULL 应使用 IS NULL 或 IS NOT NULL yard_location NULL 是无效的任何值与 NULL 比较如 、!都返回 UNKNOWN即不匹配任何结果 那么结合Sql代码以及Mybatisplus中的语句进行探讨
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 的方式因此返回正确结果
2. 基本知识
MyBatis-Plus 提供了 isNull 和 isNotNull 方法用于处理 NULL 值的查询条件
isNull用于查询字段值为 NULL 的数据
.isNull(字段名)isNotNull用于查询字段值非 NULL 的数据
.isNotNull(字段名)基本的查询示例如下
查询字段值为 NULL 的记录
ListGoodsLogDO goodsLogs goodsLogMapper.selectList(new QueryWrapperGoodsLogDO().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 的记录
ListGoodsLogDO goodsLogs goodsLogMapper.selectList(new QueryWrapperGoodsLogDO().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 的记录
ListGoodsLogDO goodsLogs goodsLogMapper.selectList(new QueryWrapperGoodsLogDO().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;3. 总结
上述知识点主要是明白一个知识点 区分 NULL 和空字符串 在数据库中NULL 和 “” 是不同的。如果需要同时查询两种情况必须显式使用 IS NULL 和 条件 MyBatis-Plus 默认行为 MyBatis-Plus 不会自动将空字符串“”视为 NULL SQL 默认比较规则 避免使用 NULL 或 ! NULL改用 IS NULL 或 IS NOT NULL 空值赋值处理 插入数据时如果字段需要为空应显式插入 NULL 而非 “”以确保查询逻辑一致