应启用 useActualColumnNames="true" 让 MBG 直接读取 Oracle 元数据中的大写列名,生成如 的映射,确保 column 与数据库实际列名一致。
Oracle 字段名默认大写,MyBatis Generator 生成的 resultMap 却小写,查不到数据
oracle 默认把未加双引号的字段名转为大写存入数据字典,而 mybatis generator(mbg)默认按小写生成 java 属性和 resultmap 中的 column 值,导致 sql 查询时列映射失败——查出来全是 null。
根本原因不是 MBG 有 bug,而是它默认按标准 JDBC 行为处理:不强制大小写敏感,依赖驱动和数据库实际返回的元数据格式。Oracle JDBC 驱动在未显式设置下,返回的列名是大写的。
- 检查你生成的
Mapper.xml,看<result column="user_name" property="userName"></result>这类写法是否对应 Oracle 实际列名USER_NAME - 临时验证方法:在
select语句里给字段加别名,比如SELECT USER_NAME AS user_name FROM ...,能查到说明就是列名大小写不匹配 - 最稳妥的解法不是改 SQL,而是让 MBG 生成时就用大写列名 —— 需配合
columnOverride或启用useActualColumnNames
用 useActualColumnNames=true 让 MBG 直接读取 Oracle 元数据中的真实列名
这个配置会让 MBG 跳过“转小写 + 下划线转驼峰”的默认逻辑,直接采用数据库元数据返回的列名(Oracle 下就是全大写),再配合 configurationType="org.mybatis.generator.config.ConfigurationType" 级别的设置生效。
注意它只影响 column 值,不影响 Java 属性名(仍走驼峰规则),所以 property 和 column 依然能对上 —— 前提是你没手动改过 property 名。
- 在
generatorConfig.xml的<table> 标签里加:<code>useActualColumnNames="true" - 如果用了
<columnoverride></columnoverride>,它的column值优先级更高,会覆盖useActualColumnNames - 某些老版本 MBG(如 1.3.2)对 Oracle 支持不完整,建议升级到 1.4.0+,否则可能读不到正确列名
- 开启后生成的
resultMap会变成:<result column="USER_NAME" property="userName"></result>,和 Oracle 实际一致 - 在
<table tablename="USER_INFO"> 内添加:<code><columnoverride column="CREATE_TIME" property="createTime"></columnoverride> -
column值必须跟 Oracle 数据字典里完全一致(包括大小写),可用SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'USER_INFO'查证 - 不要只写
columnOverride不写property,否则 MBG 可能仍按默认规则生成属性名,造成不一致 - 如果字段带特殊字符(如
"ORDER"这种关键字),必须加双引号:column=""ORDER""(XML 中需转义为"ORDER") - 接口方式示例:
@Select("SELECT USER_NAME, CREATE_TIME FROM USER_INFO") @Results({ @Result(column = "USER_NAME", property = "userName"), @Result(column = "CREATE_TIME", property = "createTime") }) List<userinfo> selectAll();</userinfo> - XML 方式:定义独立
<resultmap id="BaseResultMap"></resultmap>,column全大写,然后在<select resultmap="BaseResultMap"></select>中引用 - 注意:如果同时存在 MBG 生成的 XML 和手写 resultMap,确保 namespace 不冲突,否则 MyBatis 会报
Duplicate Mapped Statements - 这种写法绕过了 MBG 的驼峰转换逻辑,所以
property名必须和 Java 类字段名严格一致(区分大小写)
columnOverride 手动指定大小写,适合混合命名或特殊字段
当表里既有 CREATE_TIME 又有 is_deleted 这种不规范字段时,useActualColumnNames 会统一用大写,反而破坏已有约定。这时就得逐字段控制。
它比全局配置更精细,但维护成本高;适合补救已上线项目、或对接遗留 Oracle 表。
Java 层加 @Results 或 resultMap 手动映射,绕过 MBG 生成逻辑
当 MBG 配置调不通、或只想局部修复时,直接在 Mapper 接口或 XML 里写死映射最省事。这不是长久之计,但对紧急上线或测试验证非常快。
关键点在于:你写的 column 必须和 Oracle 返回的列名大小写完全一致,且不能依赖 MBG 自动生成的 resultMap。
resultMap。一旦列名大小写对齐,后面所有环节都顺了。










