mybatis默认不自动转换下划线命名,需配置mapunderscoretocamelcase=true启用驼峰映射;该配置仅对自动映射生效(即未定义resultmap、未显式绑定字段时),若使用resultmap则须设automapping="true"才能兼顾自动与手动映射。
java 驼峰属性不匹配的难题">
MyBatis 默认不自动转换数据库下划线命名(如 user_name)到 Java 驼峰命名(如 userName),但通过配置或 <resultmap></resultmap> 可精准控制映射关系。重点不是非得手写 <resultmap></resultmap>,而是知道什么场景该用、怎么写才高效。
开启全局驼峰转换最省事
多数情况下,无需写 <resultmap></resultmap>。在 MyBatis 全局配置(mybatis-config.xml 或 Spring Boot 的 application.yml)中启用 mapUnderscoreToCamelCase 即可:
-
XML 配置方式:
<settings><br> <setting name="mapUnderscoreToCamelCase" value="true"></setting><br></settings>
-
Spring Boot 方式(application.yml):
mybatis:<br> configuration:<br> map-underscore-to-camel-case: true
开启后,只要 Java 实体字段是标准驼峰(userEmail),数据库列是 user_email,MyBatis 就能自动匹配,无需额外映射。
什么时候必须用
以下情况绕不开 <resultmap></resultmap>:
- 部分字段需特殊处理(如数据库存的是
status数值,Java 要映射为枚举OrderStatus) - 字段名与驼峰规则冲突(如数据库有
xml_data,但 Java 字段叫xmlData—— 默认规则会误转为xmldata) - 需要关联查询(
<association></association>/<collection></collection>) - 列别名混乱或使用了函数(如
DATE_FORMAT(create_time, '%Y-%m'))
手写 resultMap 的正确写法
假设数据库表有 user_id、user_name、create_time,Java 实体为:
public class User {
private Long userId;
private String userName;
private LocalDateTime createTime;
}
对应 <resultmap></resultmap> 应明确指定列与属性的映射:
<resultmap id="UserResultMap" type="User"><id property="userId" column="user_id"></id><result property="userName" column="user_name"></result><result property="createTime" column="create_time"></result></resultmap><p><select id="selectUser" resultmap="UserResultMap">
SELECT user_id, user_name, create_time FROM user WHERE user_id = #{id}
</select></p>
注意:不要只写部分字段就以为“其余靠自动”,<resultmap></resultmap> 是全量覆盖机制 —— 一旦用了它,未声明的字段将不会被映射,除非显式写出或配合 autoMapping="true"(MyBatis 3.4+ 支持)。
进阶:混合使用自动映射 + 手动覆盖
如果大部分字段符合驼峰规则,仅个别需定制,可用 autoMapping="true" 开启自动映射,并只手动声明例外字段:
<resultmap id="UserResultMap" type="User" automapping="true"><!-- 仅覆盖需要特殊处理的字段 --><result property="userName" column="user_name"></result><!-- status_num → 枚举字段 status --><result property="status" column="status_num" javatype="com.example.StatusEnum"></result></resultmap>
这样既保持简洁,又保留灵活性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











