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对象之间的映射关系,帮助我们更轻松地处理数据。

相关推荐
面试官E先生6 分钟前
【极兔快递Java社招】一面复盘|数据库+线程池+AQS+中间件面面俱到
java·面试
琢磨先生David10 分钟前
构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
java·设计模式·建造者模式
JhonKI10 分钟前
【MySQL】变更缓冲区:作用、主要配置以及如何查看
数据库·mysql
TDengine (老段)23 分钟前
什么是物联网 IoT 平台?
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
小雅痞25 分钟前
[Java][Leetcode simple]26. 删除有序数组中的重复项
java·leetcode
青云交32 分钟前
Java 大视界 -- 基于 Java 的大数据分布式存储在工业互联网海量设备数据长期存储中的应用优化(248)
java·大数据·工业互联网·分布式存储·冷热数据管理·hbase 优化·kudu 应用
纸包鱼最好吃42 分钟前
java基础-package关键字、MVC、import关键字
java·开发语言·mvc
唐山柳林1 小时前
城市生命线综合管控系统解决方案-守护城市生命线安全
java·安全·servlet
PgSheep1 小时前
Spring Cloud Gateway 聚合 Swagger 文档:一站式API管理解决方案
java·开发语言
boring_1111 小时前
从Aurora 架构看数据库计算存储分离架构
数据库·架构