MyBatis 自定义映射 ResultMap:字段与属性的映射详解

在 MyBatis 框架中,ResultMap 是一个非常强大的功能,它允许我们自定义SQL查询结果与Java对象之间的映射关系。特别是在数据库字段名和Java对象属性名不一致时,ResultMap能够帮助我们精确地映射数据。

ResultMap 的基本使用

若字段名和实体类中的属性名不一致,则可以通过resultMap设置自定义映射,即使字段名和属性名一致的属性也要映射 ,也就是全部属性都要列出来

ResultMap 通过在XML映射文件中定义 ,可以指定一个唯一的 id,以及一个 type 属性来指定要映射的Java类型。在ResultMap内部,我们可以使用 <id> 和 <result> 标签来分别映射主键字段和普通字段。

xml 复制代码
xml
<resultMap id="empResultMap" type="Emp">  
    <id property="eid" column="eid"/>  
    <result property="empName" column="emp_name"/>  
    <result property="age" column="age"/>  
    <result property="sex" column="sex"/>  
    <result property="email" column="email"/>  
</resultMap>  
  
<select id="getAllEmp" resultMap="empResultMap">  
    SELECT * FROM t_emp  
</select>

在这个例子中,empResultMap定义了如何将 t_emp 表中的字段映射到 Emp 类的属性上。

  • 说明:
    resultMap:设置自定义映射
    • 属性:
      • id:表示自定义映射的唯一标识,不能重复
      • type:查询的数据要映射的实体类的类型
    • 子标签:
      • id:设置主键的映射关系
      • result:设置普通字段的映射关系
      • 子标签属性:
        • property:设置映射关系中实体类中的属性名
        • column:设置映射关系中表中的字段名

处理字段名和属性名不一致的情况

若字段名和实体类中的属性名不一致,但是字段名符合数据库的规则(使用_),实体类中的属性名符合Java的规则(使用驼峰)。除了使用ResultMap,还有其他两种常见方法处理字段名和实体类中的属性的映射关系:

使用字段别名

在SQL查询中,我们可以为字段指定别名,使其与Java对象的属性名保持一致。这样,MyBatis在映射时就可以自动找到对应的属性。

xml 复制代码
xml
<select id="getAllEmp" resultType="Emp">  
    SELECT eid, emp_name AS empName, age, sex, email FROM t_emp  
</select>
全局配置自动映射

MyBatis允许我们设置一个全局配置,使得在查询时自动将下划线分隔的字段名转换为驼峰命名的属性名。这通过 mapUnderscoreToCamelCase 设置项实现。

在MyBatis的核心配置文件中:

xml 复制代码
xml
<settings>  
    <setting name="mapUnderscoreToCamelCase" value="true"/>  
</settings>

在Spring Boot的 application.yml 或 application.properties 配置文件中:

yml 复制代码
yml
mybatis-plus:  
  configuration:  
    map-underscore-to-camel-case: true

注意:在使用MyBatis-Plus时,该设置项通常已经默认启用。

为什么要使用ResultMap

虽然上述两种方法都能处理字段名和属性名不一致的问题,但ResultMap提供了更大的灵活性和控制力。特别是当数据库表结构复杂,或者需要关联多个表查询时,ResultMap能够帮助我们精确地控制数据的映射关系。

此外,ResultMap还支持关联映射 (association)和集合映射 (collection),可以处理更复杂的查询结果,如一对多 、多对一等关系。

总之,ResultMap 是 MyBatis 中一个非常强大且实用的功能,它允许我们灵活地定义SQL查询结果与Java对象之间的映射关系,帮助我们更轻松地处理数据。

相关推荐
PaperData7 小时前
1985-2025年全国区县专利申请与授权面板数据
数据库
snpgroupcn7 小时前
大数据量SAP迁移方案:系统越大,越不能硬搬
数据库·sap
明月_清风8 小时前
Muse 登顶 App Store 第一,SDK 直接开源:AI Agent 开始进入下一个阶段
人工智能·后端
leikooo8 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Flynt8 小时前
Redis Cluster主节点挂了,为什么"高可用"还全员掉线?我把三次kill的记录翻出来了
数据库·redis·分布式
笃行3508 小时前
KingbaseES 数据加密全解:从 SSL 到全密态
数据库
Ivanqhz9 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主9 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐9 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合10 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化