如果只是为了 检查记录是否存在 (即 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 工具链风格。