温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java mybatis为何查询返回空

发布时间:2026-09-02 19:07:19 来源:亿速云 阅读:107 作者:小樊 栏目:编程语言

在 Java + MyBatis 中,查询返回空(null、空 List、或字段为 null) 是很常见的问题,原因通常集中在以下几个方面。我按出现频率从高到低帮你梳理,并给出排查方法。


一、最常见原因

1️⃣ SQL 本身没查到数据

这是最直接的:

  • 数据库里确实没有符合条件的数据
  • 条件写错了(如 status = 1 但实际是 '1'

✅ 排查方式:

-- 把 MyBatis 生成的 SQL 复制到数据库客户端执行
SELECT * FROM user WHERE id = 123;

2️⃣ 参数未正确传递(#{} 没生效)

常见错误:

<select id="getUser" resultType="User">
  SELECT * FROM user WHERE id = #{id}
</select>

但调用时:

getUser(null); // 或者参数名不匹配

✅ 排查:

  • 开启 MyBatis 日志,看实际 SQL 参数
logging:
  level:
    com.xxx.mapper: debug

3️⃣ 返回类型用错

情况 A:方法返回对象,但查到 0 条

User getUser(); // 查不到返回 null(正常)

情况 B:方法返回 List,但查不到

List<User> list = getUser(); // 返回 [] 不是 null(正常)

✅ 注意:

  • 单条查询 → 可能返回 null
  • 列表查询 → 通常返回 空集合,不是 null

4️⃣ 字段名和实体类不一致(返回对象但属性为 null)

数据库:

user_name

Java:

private String username;

❌ 结果:对象不为 null,但字段全是 null

✅ 解决方案:

方式 1:SQL 起别名

SELECT user_name AS username FROM user

方式 2:开启驼峰映射

mybatis:
  configuration:
    map-underscore-to-camel-case: true

5️⃣ resultType / resultMap 配置错误

错误示例:

<select id="getUser" resultType="java.lang.String">

但你需要的是 User

✅ 检查:

  • resultType 是否指向正确实体
  • 是否应使用 resultMap

二、容易忽略的原因

6️⃣ Mapper 方法未正确代理

  • 没加 @Mapper
  • 没扫描到 Mapper 包
@Mapper
public interface UserMapper {}

或:

@MapperScan("com.xxx.mapper")

7️⃣ 事务 / 数据源问题

  • 查的是 从库,但数据在 主库
  • 多数据源配置错误

8️⃣ 逻辑删除 / 拦截器过滤

如 MyBatis-Plus:

@TableLogic
private Integer deleted;

deleted = 1 的数据会自动被过滤


三、快速自查清单 ✅

你可以按顺序排查:

  1. ✅ SQL 在数据库里能查到吗?
  2. ✅ MyBatis 日志里的 SQL + 参数对吗?
  3. ✅ 返回的是 null 还是空 List?
  4. ✅ 实体类字段和数据库列名一致吗?
  5. ✅ resultType / resultMap 对吗?

四、如果你愿意

你可以把下面信息发我,我可以直接帮你定位:

  • Mapper 接口
  • XML / 注解 SQL
  • 实体类
  • 返回结果(null / 空 List / 字段 null)

我可以精确到哪一行导致返回空

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI