MyBatis查询结果为null或字段为空,主因是列名与实体属性名不匹配;解决方式有三:①开启下划线转驼峰自动映射(全局配置,最省事);②SQL中用AS起别名(轻量灵活,适合单次调整);③定义resultMap手动映射(最精准,适合复杂场景)。

MyBatis 查询结果为 null 或部分字段为空,大概率是列名(如 user_name)和 Java 实体属性名(如 userName)没对上。它默认严格按名字匹配,不一致就跳过赋值。解决的核心思路就是“建立明确的映射关系”,有三种主流方式,按推荐顺序和适用场景说明如下:
开启下划线转驼峰自动映射(最省事,适合规范命名)
这是全局配置方案,适用于数据库用下划线命名(create_time)、Java 用标准驼峰(createTime)的常规项目。
- Spring Boot 中,在
application.yml加一行:
mybatis.configuration.map-underscore-to-camel-case=true - 传统 XML 配置,在
mybatis-config.xml的<settings>里加:<setting name="mapUnderscoreToCamelCase" value="true"/> -
前提必须满足:实体类属性名是合法驼峰(如
orderStatus),不能写成orderstatus或ORDER_STATUS;SQL 中若用了AS别名(比如user_name AS userName),则会绕过驼峰规则,直接按别名匹配。
SQL 中用 AS 给字段起别名(轻量灵活,适合单次调整)
在 <select> 语句里显式把列名改成和属性名一致,简单直接,无需额外配置或定义。
- 例如数据库字段是
user_name、create_time,而实体属性是userName、createTime,就写:SELECT id, user_name AS userName, create_time AS createTime FROM user - 优点是改动小、见效快,适合临时适配或字段较少的查询;缺点是每个 SQL 都得手动改,重复劳动多,且无法处理复杂嵌套或动态列。
定义 resultMap 手动映射(最精准,适合复杂场景)
当字段和属性差异大(比如 u_email → contactEmail)、需要处理主键/关联对象、或要复用映射逻辑时,resultMap 是最可靠的选择。
立即学习“Java免费学习笔记(深入)”;
- 在 Mapper XML 中定义一个
<resultMap>,明确写出每一对映射:<resultMap id="userMap" type="User"><br> <id column="id" property="id"/><br> <result column="user_name" property="userName"/><br> <result column="create_time" property="createTime"/><br></resultMap>
- 查询时用
resultMap="userMap"替代resultType;注解方式可用@Results+@Result实现同样效果。 - 它不依赖命名约定,也不怕别名干扰,还能支持嵌套结果(如
<association>)、延迟加载等高级功能。


















