Mybatisplus查询返回null但条数正确的原因分析
MybatisPlus查询返回null但条数正确,通常因字段映射问题。默认驼峰映射将数据库下划线字段转为驼峰,而JavaBean仍用下划线,导致映射失败。解决方法包括统一驼峰命名、检查Setter方法或关闭驼峰映射配置。
1、问题描述
在实际开发中,有时会遇到一个奇怪的现象:用 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,还是配置未关闭驼峰映射,都可以根据上述方法逐一排查。希望这份经验能帮你快速定位问题。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Zustand 状态管理:从跨组件共享到性能优化的实战指南
本文深入解析 Zustand 在 React 应用中的核心机制,重点阐述如何通过发布订阅模式解决 Props Drilling 问题。通过具体代码演示 Store 的创建与跨组件读写,验证响应式更新流程。文章详细讲解选择器机制对渲染性能的影响,并剖析状态拆分、异步处理及适用边界等常见陷阱,提供一套兼
Python 单元测试隔离术:掌握 patch 替换与 Mock 行为控制
在 Python 测试中,隔离外部依赖是保证用例稳定性的关键。本文从 `unittest mock` 的核心机制出发,解析 `patch` 如何精准替换查找路径上的对象,以及 Mock 如何模拟函数、类与属性行为。通过具体代码示例,展示如何控制返回值、异常抛出及调用验证,并重点剖析路径错误、装饰器顺
Python静态检查:mypy类型检查配置
介绍mypy的静态类型检查机制,以及如何在Python项目中完成安装、配置、执行检查并逐步收紧类型约束,帮助开发者尽早发现类型错误并避免常见配置陷阱。
PHP 接口:从契约约束到依赖注入的实战指南
本文从 PHP 接口的契约本质出发,探讨如何利用类型提示(Type Hinting)强化行为约束,并通过依赖注入实现模块间的低耦合。文章结合具体代码示例,解析接口在提升代码可替换性与可维护性方面的核心价值,同时指出常见的设计陷阱与应对策略,帮助开发者建立清晰的抽象思维。
Python迭代器:iter与next协议实现
从迭代器协议入手,理解iter()与next()的协作机制,并通过自定义迭代器掌握协议实现、StopIteration终止、实际验证以及常见避坑。
- 热门数据榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-10-09 18:15
2026-10-09 18:10
2026-10-09 18:05
2026-10-09 18:00
2026-10-09 17:55
2026-10-09 17:50
2026-10-09 17:45
2026-10-09 17:40
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

