全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

@Results 结果映射

当数据库列名与 Java 实体属性名不一致,或需要处理复杂类型映射时,使用 @Results 系列注解替代 XML 中的 <resultMap>

@Results 与 @Result

基础映射

Java
public interface UserMapper {

    @Select("SELECT id, user_name, email_addr, create_time FROM users WHERE id = #{id}")
    @Results({
        @Result(id = true, column = "id", property = "id"),
        @Result(column = "user_name", property = "name"),
        @Result(column = "email_addr", property = "email"),
        @Result(column = "create_time", property = "createTime")
    })
    User getById(@Param("id") Long id);
}
属性说明
id = true标记为主键列,一个 @Results 中只能有一个
column数据库列名
propertyJava 实体属性名
jdbcType指定 JDBC 类型,如 JdbcType.TIMESTAMP
typeHandler自定义类型处理器

驼峰自动映射

开启驼峰转换后,user_nameuserName 自动映射,无需手动配置 @Result

YAML
mybatis:
  configuration:
    map-underscore-to-camel-case: true

开启后仅需标注不一致的字段:

Java
@Select("SELECT id, user_name, email_addr FROM users WHERE id = #{id}")
@Results({
    @Result(column = "email_addr", property = "email")
})
User getById(@Param("id") Long id);
// user_name → userName 自动映射

@ResultMap 复用映射

当多个查询共用同一套映射规则时,使用 @ResultMap 避免重复定义。

定义与引用

Java
public interface UserMapper {

    String USER_MAP = "com.example.mapper.UserMapper.userResultMap";

    @Results(id = "userResultMap", value = {
        @Result(id = true, column = "id", property = "id"),
        @Result(column = "user_name", property = "name"),
        @Result(column = "email_addr", property = "email"),
        @Result(column = "create_time", property = "createTime")
    })
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getById(@Param("id") Long id);

    @ResultMap(USER_MAP)
    @Select("SELECT * FROM users WHERE status = #{status}")
    List<User> listByStatus(@Param("status") Integer status);

    @ResultMap(USER_MAP)
    @Select("SELECT * FROM users WHERE dept_id = #{deptId}")
    List<User> listByDeptId(@Param("deptId") Long deptId);
}

@Results 中设置 id 属性后,其他方法通过 @ResultMap + 完全限定名 引用。

复杂类型映射

枚举类型

Java
@Select("SELECT id, name, status FROM users WHERE id = #{id}")
@Results({
    @Result(id = true, column = "id", property = "id"),
    @Result(column = "name", property = "name"),
    @Result(column = "status", property = "status",
        typeHandler = EnumOrdinalTypeHandler.class)
})
User getById(@Param("id") Long id);

JSON 字段

Java
@Select("SELECT id, name, config FROM users WHERE id = #{id}")
@Results({
    @Result(id = true, column = "id", property = "id"),
    @Result(column = "name", property = "name"),
    @Result(column = "config", property = "config",
        typeHandler = JacksonTypeHandler.class)
})
User getById(@Param("id") Long id);

实体字段:

Java
public class User {
    private Long id;
    private String name;
    @TableField(typeHandler = JacksonTypeHandler.class)
    private Map<String, Object> config;
}

多表 JOIN 结果映射

Java
@Select("SELECT o.id AS order_id, o.amount, u.user_name, u.email_addr " +
        "FROM orders o LEFT JOIN users u ON o.user_id = u.id " +
        "WHERE o.id = #{id}")
@Results({
    @Result(id = true, column = "order_id", property = "id"),
    @Result(column = "amount", property = "amount"),
    @Result(column = "user_name", property = "user.name"),
    @Result(column = "email_addr", property = "user.email")
})
OrderVO findOrderWithUser(@Param("id") Long id);

@Results 与 XML resultMap 对比

维度@Results 注解XML
定义位置Mapper 接口方法上XML 文件中
复用方式@ResultMap + 完全限定名refid 引用
可读性SQL 与映射耦合,方法上内容较长独立配置,结构清晰
适用场景映射简单、复用少映射复杂、多查询复用

要点总结

  • @Results 定义结果映射,@Result 定义单列映射,id = true 标记主键
  • @ResultMap 复用已定义的映射,通过 @Results(id = "xxx") 定义 + 完全限定名引用
  • 开启 map-underscore-to-camel-case 可自动处理驼峰命名,减少手动映射
  • 复杂类型(枚举、JSON)通过 typeHandler 属性指定类型处理器
  • 映射规则简单时推荐注解,多查询共用复杂映射推荐 XML

📝 发现内容有误?点击此处直接编辑

← 上一篇 @One 与 @Many 关联
下一篇 → @Select 等基础注解
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库