当前位置: 首页 > news >正文

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

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

ResultMap 的基本使用

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

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

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
<select id="getAllEmp" resultType="Emp">  SELECT eid, emp_name AS empName, age, sex, email FROM t_emp  
</select>
全局配置自动映射

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

xml
<settings>  <setting name="mapUnderscoreToCamelCase" value="true"/>  
</settings>

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

yml
mybatis-plus:  configuration:  map-underscore-to-camel-case: true

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

为什么要使用ResultMap

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

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

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

http://www.lryc.cn/news/375994.html

相关文章:

  • 找单身狗2
  • element-ui将组件默认语言改为中文
  • SuperMap iClient3D 11i(2023) SP1 for Cesium 调整
  • 保姆级小白就业人工智能(视频+源码+笔记)
  • 微信小程序,分享和反馈功能
  • 数据安全未来之路,天空卫士荣誉领榜《中国数据安全50强(2024)》
  • CAD二次开发(10)-单行文字的添加+图形修改
  • 【SpringBoot集成Spring Security】
  • docker部署dm数据库
  • Shell中执行.sh文件的常见方式
  • 超分辨率重建——2022冠军RLFN网络推理测试(详细图文教程)
  • 国际荐酒师香港协会受邀参加2024年美国独立日庆祝活动
  • (微服务实战)聚合支付系统商户线上聚合收银台接口设计
  • 【漏洞复现】CRMEB开源电商系统 /api/products SQL注入漏洞(CVE-2024-36837)
  • 摄像头图像矫正的表格生成方法
  • 【Arc gis】Arc gis出现ERROR 999999问题的解决办法
  • 优化 Flutter 应用开发:探索 ViewModel 的威力
  • Android开发系列(四)Jetpack Compose之Button
  • Java17 --- RabbitMQ之插件使用
  • 6.18总结
  • 【ARM Cache 及 MMU 系列文章 1.4 -- 如何判断 L3 Cache 是否实现?】
  • 打印mybatis的sql日志
  • QT day4(对话框 事件机制)
  • 序列化与反序列化漏洞实例
  • 6、while循环 - 习题解析
  • ReentrantLock可重入锁
  • 如何秒杀系统架构设计
  • 深度神经网络——什么是降维?
  • SpringMVC—RequestMapping注解
  • Java线程池基本概念