如果只是为了 检查记录是否存在 (即 where
条件是否匹配到数据),那么最优的 MyBatis XML 配置方式是 返回 Boolean
类型,这样代码最简洁直观。
推荐方案:返回 Boolean
(最佳实践)
1. MyBatis XML 配置
xml
<select id="existsByCondition" resultType="java.lang.Boolean">
SELECT 1 FROM lacent WHERE your_condition LIMIT 1
</select>
SELECT 1
:只返回1
(如果记录存在)或null
(如果记录不存在)。LIMIT 1
:优化查询,找到第一条匹配就返回,避免全表扫描。resultType="java.lang.Boolean"
:MyBatis 会自动将1
转为true
,null
转为false
。
2. Java Mapper 接口
java
public interface LacentMapper {
boolean existsByCondition(@Param("param") YourQueryParam param);
// 或 Boolean(可返回 null,但通常不需要)
}
3. 调用方式
java
if (mapper.existsByCondition(param)) {
// 记录存在,执行你的业务逻辑
} else {
// 记录不存在
}
替代方案对比
方案 | 返回类型 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|
Boolean (推荐) |
boolean |
仅需判断是否存在 | 代码简洁,MyBatis 自动转换 | 无 |
Integer |
Integer |
需要返回 1 /null |
灵活 | 需手动判空 |
count(*) |
long |
需要计数 | 可获取匹配数量 | 性能稍差(需全表计算) |
为什么 SELECT 1 + LIMIT 1
是最优解?
- 性能最佳:数据库找到第一条匹配记录就返回,不会继续扫描。
- 代码最简洁 :直接返回
boolean
,无需额外判空或转换。 - 通用性强:适用于 MySQL、PostgreSQL、Oracle 等主流数据库。
其他常见写法(不推荐)
❌ 不推荐:使用 count(*)
(除非真的需要计数)
xml
<select id="countRecords" resultType="long">
SELECT COUNT(*) FROM lacent WHERE your_condition
</select>
- 问题 :即使只需要判断是否存在,
COUNT(*)
也会扫描所有匹配行,性能较差。
❌ 不推荐:返回 Integer
并手动判空
java
Integer result = mapper.checkExists(param);
if (result != null) { ... }
- 问题 :代码冗余,不如
Boolean
直接。
总结
- 最佳实践 :
SELECT 1 ... LIMIT 1
+resultType="Boolean"
。 - 适用场景:仅需检查记录是否存在,不关心具体数据。
- 优势:高性能 + 代码简洁。
如果你的业务逻辑只是判断记录是否存在,就用这个方案! 🚀
如果返回值是Integer,使用hutool工具怎么判断返回值是否有值?
如果 MyBatis 返回 Integer
类型 (如 select 1 from table where ...
),并使用 Hutool 工具判断是否有值,可以采用以下几种方式:
1. 使用 ObjectUtil
判断是否非 null
Hutool 的 ObjectUtil
提供了安全的空值判断:
java
Integer result = mapper.checkExists(param);
// 判断是否有值(非 null)
if (ObjectUtil.isNotNull(result)) {
// 存在记录(result == 1)
} else {
// 不存在记录(result == null)
}
2. 使用 NumberUtil
增强数值判断
如果需严格判断返回值是 1
(而不仅仅是非 null
):
java
Integer result = mapper.checkExists(param);
// 判断是否等于 1(同时避免 NPE)
if (NumberUtil.equals(result, 1)) {
// 存在记录
}
3. 使用 Optional
包装(Java 8+ 风格)
结合 Hutool 的 Optional
或 Java 原生 Optional
:
java
Integer result = mapper.checkExists(param);
// Hutool 的 Optional(需依赖 cn.hutool.core.lang.Optional)
Optional.ofNullable(result)
.ifPresent(r -> System.out.println("存在记录,值为: " + r));
// 或 Java 原生 Optional
Optional.ofNullable(result)
.filter(r -> r == 1)
.ifPresent(r -> System.out.println("存在记录"));
4. 完整代码示例
MyBatis XML
xml
<select id="checkExists" resultType="java.lang.Integer">
SELECT 1 FROM lacent WHERE your_condition LIMIT 1
</select>
Java 调用
java
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.NumberUtil;
public class Test {
public static void main(String[] args) {
Integer result = mapper.checkExists(param);
// 方式1:推荐(仅判非 null)
if (ObjectUtil.isNotNull(result)) {
System.out.println("记录存在");
}
// 方式2:严格判 1
if (NumberUtil.equals(result, 1)) {
System.out.println("记录存在且值为 1");
}
}
}
为什么推荐 ObjectUtil.isNotNull()
?
- 安全 :避免直接
if (result != null)
的低级拼写错误。 - 可读性:Hutool 的方法名更语义化。
- 扩展性 :后续可轻松改为其他工具类方法(如
NumberUtil
)。
注意事项
-
Integer
与int
区别:- 如果 MyBatis 返回
int
,查询无结果时会抛异常(需用Integer
)。 - 建议始终用
Integer
接收,避免 NPE 风险。
- 如果 MyBatis 返回
-
性能 :
ObjectUtil.isNotNull()
和直接!= null
性能几乎无差别,可放心使用。 -
Hutool 版本 :
确保引入最新 Hutool 依赖:
xml<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-core</artifactId> <version>5.8.16</version> </dependency>
总结
场景 | Hutool 方案 | 等价原生代码 |
---|---|---|
判断是否非 null |
ObjectUtil.isNotNull(result) |
result != null |
判断是否等于 1 |
NumberUtil.equals(result, 1) |
result != null && result == 1 |
链式安全操作 | Optional.ofNullable(result) |
Java 原生 Optional |
推荐优先使用 ObjectUtil.isNotNull()
,简洁且符合 Hutool 工具链风格。