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简化配置。

相关推荐
小飞Coding3 分钟前
MyBatis Mapper 实现原理彻底解密——从动态代理到 JDBC 执行全链路剖析
后端·mybatis
华科易迅4 小时前
MybatisPlus乐观锁
java·开发语言·mybatis
野犬寒鸦4 小时前
Redis复习记录Day03
服务器·redis·后端·面试·bootstrap·mybatis
爱丽_9 小时前
MyBatis 性能优化:批处理、分页、缓存与慢 SQL 定位
缓存·性能优化·mybatis
PacosonSWJTU1 天前
(转)mybatis拦截器
数据库·redis·mybatis
二等饼干~za8986681 天前
豆包GEO优化源码开发全解析:技术架构、实现逻辑与实操指南
数据库·sql·重构·架构·mybatis·音视频
星晨雪海1 天前
MyBatis-Plus 常用 CRUD 方法大全
linux·tomcat·mybatis
yangyanping201081 天前
广告系统设计二之RTA系统设计
java·spring·mybatis
Boop_wu1 天前
[Mybatis] MyBatis 快速入门教程(2)
mybatis
※DX3906※1 天前
SpringBoot之旅4: MyBatis 操作数据库(进阶) 动态SQL+MyBatis-Plus实战,从入门到熟练,再也不踩绑定异常、SQL拼接坑
java·数据库·spring boot·spring·java-ee·maven·mybatis