游乐游手机版
首页/编程语言/文章详情

Mybatisplus查询返回null但条数正确的原因分析

时间:2026-07-30 22:08
MybatisPlus查询返回null但条数正确,通常因字段映射问题。默认驼峰映射将数据库下划线字段转为驼峰,而JavaBean仍用下划线,导致映射失败。解决方法包括统一驼峰命名、检查Setter方法或关闭驼峰映射配置。

1、问题描述

在实际开发中,有时会遇到一个奇怪的现象:用 MybatisPlus 查询数据,返回的列表条数是对的,但每个元素都是 null,程序也不报错。先看一段出问题的代码:

Mybatisplus查询返回null但条数正确是什么原因?

1、自定义的 StudentMapper 继承了 BaseMapper 接口:

public interface StudentMapper extends BaseMapper {
}

2、调用 selectList 方法查询数据时,打印结果全都是 null,但条数是对的——比如查出来 5 条,就打印 5 个 null。

代码如下:

@RequestMapping("/testmybatisplus")
    @ResponseBody
    public void testmybatisplus() {
        System.out.println("===1===");
        List list=studentMapper.selectList(null);
        //Assert.isTrue(5 == list.size(), "");
        list.forEach(System.out::println);
    }

2、出现问题的原因

根本原因在于命名规范不匹配。看看数据库建表语句:

CREATE TABLE student(
   stu_id VARCHAR(50),
   stu_name VARCHAR(30),
   stu_sex VARCHAR(2),
   stu_age VARCHAR(4),
   stu_addr VARCHAR(50),
   stu_pwd VARCHAR(50)
)DEFAULT CHARSET=utf8;

MybatisPlus 默认开启了驼峰命名映射,也就是说它会自动将数据库字段 stu_id 映射为 stuId,stu_name 映射为 stuName,以此类推。而对应的 Java Bean 字段却是这样的:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private String stu_id;
    private String stu_name;
    private String stu_sex;
    private String stu_age;
    private String stu_addr;
    private String stu_pwd;

}

看到了吗?数据库字段是下划线风格,Java 字段也是下划线风格,但 MybatisPlus 默认的驼峰映射却把数据库字段当成驼峰来处理,导致字段名对不上:数据库字段被映射成了 stuId,而 Bean 里是 stu_id,映射自然失败,结果就是每个对象都是 null,但数量统计是正常的。

3、解决方法

3.1、解决办法 1

统一使用驼峰命名法。数据库字段写成 stu_id 没问题,但 Java 字段改成 stuId,加上 @TableId 或 @TableField 注解,或者直接让数据库字段也采用驼峰风格(比如 stuId),这样就能完美匹配。

3.2、解决办法 2

低级错误偶尔也会犯:检查是否遗漏了 setter/getter 方法或者构造器。如果 Bean 没有正确的 setter,MybatisPlus 反射拿不到赋值入口,结果同样会是 null。使用时注意 Lombok 注解是否生效,或者手动补全方法。

3.3、解决办法 3

关闭 MybatisPlus 默认的驼峰命名映射。在配置文件中做如下设置:

  • org.apache.ibatis.logging.stdout.StdOutImpl:用于打印 MybatisPlus 执行的 SQL 语句,方便调试。
  • map-underscore-to-camel-case: false:关闭驼峰命名法,让字段名保持原样映射。
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: false

需要注意的是,如果 Mapper XML 文件放在 src/main/java 目录下,路径要写成 classpath:/com/*/*/mapper/*Mapper.xml;如果放在 resource 目录,则写成 classpath:/mapper/**.xml。

总结

MybatisPlus 查询返回 null 但条数正确,十有八九是字段映射出了问题。无论是驼峰命名冲突、缺少 setter,还是配置未关闭驼峰映射,都可以根据上述方法逐一排查。希望这份经验能帮你快速定位问题。

来源:https://www.jb51.net/program/368353wr8.htm
上一篇在Ubuntu系统下编译Java时遇到错误提示的解决方法 下一篇SpringBoot整合Druid参数配置详细步骤
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
用 pytest-benchmark 建立可复现的性能基线:从对比到回归
编程语言 · 2026-10-09

用 pytest-benchmark 建立可复现的性能基线:从对比到回归

本文介绍如何利用 pytest-benchmark 为 Python 代码建立可重复的性能基准,通过基准测试、对比分析和结果验证定位性能差异,同时避免测试环境、数据规模和统计方式带来的误判。

Python数据清洗:缺失值处理与异常值检测
编程语言 · 2026-10-09

Python数据清洗:缺失值处理与异常值检测

系统掌握使用Python与Pandas进行数据清洗的方法,从识别缺失值、选择合理的填补或删除策略,到检测异常值并验证清洗效果,避免因盲目处理导致数据偏差。

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理
编程语言 · 2026-10-09

SQLAlchemy 事务避坑指南:Session 生命周期与异常处理

在 SQLAlchemy 开发中,Session 不仅是对象状态的跟踪器,更是数据库事务的边界载体。许多数据不一致问题源于对 Session 生命周期、事务提交机制及异常回滚的误解。本文从 Session 的工作单元本质出发,解析 flush 与 commit 的行为差异,探讨并发场景下的请求级 S

Redis 与 Memcached 选型指南:从架构差异到生产实践
编程语言 · 2026-10-09

Redis 与 Memcached 选型指南:从架构差异到生产实践

本文不单纯比较 QPS 峰值,而是从架构原理出发,解析 Redis 与 Memcached 在数据模型、内存管理与并发处理上的本质差异。通过统一环境的基准测试与真实业务场景分析,揭示在 Session 存储、复杂数据结构及高并发读写下的性能表现与瓶颈。文章最后提供针对缓存穿透、雪崩及大 Key 问题

Linux服务器初始化:防火墙与SELinux策略配置
编程语言 · 2026-10-09

Linux服务器初始化:防火墙与SELinux策略配置

从服务器初始化安全基线出发,系统梳理防火墙规则与SELinux策略的配置、验证、联动排障及常见避坑方法,帮助在保证服务可用的同时建立合理的访问控制边界。