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.ymlapplication.properties 配置文件中:

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

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

为什么要使用ResultMap

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

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

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

相关推荐
swipe7 小时前
11|(前端转全栈)购物车不能只存在前端:用户维度数据如何在后端落库
前端·后端·全栈
薛定谔的猫-菜鸟程序员7 小时前
基于 Electron 的本地短视频解析与下载工具:架构设计与工程实践
java·electron·音视频
千维百策6667 小时前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库
音符犹如代码8 小时前
Arthas Profiler 火焰图实战:CPU 热点在哪一目了然
java·jvm·spring boot
小园子的小菜8 小时前
Java 并发编程:线程安全队列全解 —— 阻塞与非阻塞实现原理及源码深度剖析
java·开发语言
好好沉淀8 小时前
Windows 下升级 Maven 3.6.1 到 3.9.9 踩坑全记录
java·windows·maven
阿里云云原生8 小时前
AI Agent 上线容易稳定难?阿里云 AgentLoop 推出“经验自进化”闭环治理方案
人工智能·阿里云·mybatis·agentscope
CodexDave8 小时前
Python 自动化接单实战(一):把 CSV 需求做成配置驱动解析器
java·python·自动化·json·数据清洗·python自动化·csv处理
Y3815326628 小时前
2026 年 7 月,SERP API 调用的稳定性实战:超时、重试、降级
开发语言·数据库·人工智能·php
sugar__salt8 小时前
向量数据库从零到实战:用 Milvus + Zilliz 构建 AI 日记语义检索系统
数据库·人工智能·embedding·milvus·rag·zilliz