MyBatis(28)MyBatis 映射文件中的 resultMap 和 autoMapping 冲突,如何处理

在MyBatis中,resultMap是一种高级映射策略,它允许你详细地指定如何从数据库结果集中映射数据到Java对象。通过resultMap,你可以定制列名和对象属性名之间的映射关系、处理复杂类型的映射等。另一方面,autoMapping是一个方便的特性,它允许MyBatis自动映射数据库列到同名的Java对象属性,无需显式指定每个字段的映射。

resultMapautoMapping同时使用时,MyBatis如何处理两者之间的冲突?理解这一点需要深入MyBatis的映射处理机制。以下是基于MyBatis源码的分析,注意这一分析基于特定的MyBatis版本,不同版本的实现细节可能会有所不同。

结合源码解析

映射处理流程
  1. 解析resultMap配置 :在解析XML映射文件时,MyBatis首先解析<resultMap>元素,构建一个ResultMap对象,它包含了映射的所有信息。这包括映射的列名、Java属性名、数据类型等。

  2. 处理自动映射(autoMapping :在执行查询并处理结果集时,如果启用了autoMapping,MyBatis会尝试自动映射那些在resultMap中未明确指定的列。autoMapping的处理发生在显式映射(通过resultMap定义的映射)之后。

冲突处理

如果resultMap中显式指定了某个字段的映射,同时该字段也符合自动映射的条件(即数据库列名和Java对象属性名相同),MyBatis将遵循以下原则处理冲突:

  • 显式映射优先resultMap中的映射配置具有更高的优先级。MyBatis会使用resultMap中定义的映射信息,而不是自动映射的结果。这意味着,即使autoMapping尝试映射同一个字段,resultMap中的配置将覆盖它。
代码演示

假设我们有以下resultMap和查询方法的配置:

xml 复制代码
<resultMap id="exampleMap" type="Example">
    <result property="name" column="name_column"/>
</resultMap>

<select id="selectExample" resultMap="exampleMap">
    SELECT name_column, description FROM example_table
</select>

在这个例子中,即使类Example有一个名为description的属性,且表example_table中也有一个同名的列,description的映射仍然会依赖于autoMapping的行为,除非在resultMap中也为description提供了显式映射。

深入细节
  • 源码位置DefaultResultSetHandler类是处理结果集和映射逻辑的核心。在这个类中,applyAutomaticMappings()方法处理自动映射逻辑,而applyPropertyMappings()方法处理resultMap中定义的显式映射。

  • autoMapping的开关 :可以在MyBatis配置文件中全局设置autoMappingBehavior,或者在resultMap中通过autoMapping属性为单独的映射开启或关闭自动映射。

综上所述,MyBatis在处理resultMapautoMapping冲突时,会优先考虑resultMap中的显式映射配置。这一设计保证了映射的确定性和可预测性,允许开发者在需要的时候通过resultMap提供精确控制,同时又能在简单场景下利用autoMapping简化配置。

相关推荐
慧一居士2 小时前
MyBatis-Plus的完整使用示例,完整使用示例手册
mybatis
艺杯羹7 小时前
MyBatis之核心对象与工作流程及SqlSession操作
java·mybatis
天天摸鱼的java工程师13 小时前
MyBatis Plus 的实用技巧:从业务场景到代码实现
java·后端·mybatis
wuxuanok13 小时前
Web后端开发-Mybatis
java·开发语言·笔记·学习·mybatis
netyeaxi1 天前
Java:使用spring-boot + mybatis如何打印SQL日志?
java·spring·mybatis
小七mod1 天前
【MyBatis】MyBatis与Spring和Spring Boot整合原理
spring boot·spring·mybatis
椰椰椰耶1 天前
【MyBatis】XML实现,配置方法和增、删、改、查
xml·oracle·mybatis
GJCTYU2 天前
spring中@Transactional注解和事务的实战理解附代码
数据库·spring boot·后端·spring·oracle·mybatis
DuelCode2 天前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
荔枝吻2 天前
【沉浸式解决问题】idea开发中mapper类中突然找不到对应实体类
java·intellij-idea·mybatis