@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 | 数据库列名 |
property | Java 实体属性名 |
jdbcType | 指定 JDBC 类型,如 JdbcType.TIMESTAMP |
typeHandler | 自定义类型处理器 |
驼峰自动映射
开启驼峰转换后,user_name → userName 自动映射,无需手动配置 @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
📝 发现内容有误?点击此处直接编辑