MyBatis 用 resultMap 显式声明列与属性的对应关系,支撑嵌套对象、集合、类型转换和复用配置;通过 <id>/<result> 处理命名差异,<association>/<collection> 处理关联,extends 实现继承复用。

MyBatis 用 resultMap 处理复杂字段映射,核心是**显式声明列与属性的对应关系**,绕过自动映射的限制。它不只是解决“下划线转驼峰”这类命名差异,更是支撑嵌套对象、集合、类型转换和复用配置的关键机制。
应对字段名与属性名不一致
当数据库列是 last_login_ip,而 Java 属性是 lastLoginIp,自动映射可能失效(尤其未开启 mapUnderscoreToCamelCase 时),这时需手动映射:
-
<id property="id" column="user_id"/>—— 主键必须用<id>,否则缓存和去重会出问题 -
<result property="lastLoginIp" column="last_login_ip"/>—— 普通字段用<result> - 若属性类型特殊(如枚举、JSON 字符串),可加
typeHandler指定转换逻辑
处理一对一关联(比如用户 + 用户详情)
用 <association> 映射单个嵌套对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 内联写法:直接在
resultMap中定义子对象映射 - 引用写法:复用已有的
resultMap,例如<association property="profile" resultMap="ProfileResultMap"/> - 支持延迟加载:在
<association>中设fetchType="lazy"
处理一对多关联(比如用户 + 多个订单)
用 <collection> 映射集合属性:
-
property="orders"对应 Java 中的List<Order>字段 -
ofType="Order"声明集合元素类型 - 推荐用
resultMap引用方式:<collection property="orders" ofType="Order" resultMap="OrderResultMap"/>,保持结构清晰、便于复用 - 注意 N+1 查询问题:可通过 join 查询 +
resultMap分级映射,或启用二级缓存缓解
复用与扩展映射配置
用 extends 实现 resultMap 继承,避免重复定义基础字段:
- 父映射定义通用字段:
<resultMap id="BaseUserMap" type="User">...</resultMap> - 子映射继承并扩展:
<resultMap id="AdminUserMap" type="AdminUser" extends="BaseUserMap"><result property="role" column="role_name"/></resultMap> - 子映射中同名
property会覆盖父级定义,适合差异化场景

















