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

相关推荐
凌波粒1 天前
MyBatis完整教程IDEA版(2)--ResultMap/注解/一对多/多对一/lombok/log4j
java·intellij-idea·mybatis
ANGLAL1 天前
17.MyBatis动态SQL语法整理
java·sql·mybatis
北城以北88882 天前
SSM--MyBatis框架之缓存
java·缓存·intellij-idea·mybatis
凌波粒2 天前
MyBatis完整教程IDEA版(3)--动态SQL/MyBatis缓存
sql·intellij-idea·mybatis
小马爱打代码2 天前
MyBatis:进阶 - 动态 SQL、关联查询与缓存
sql·缓存·mybatis
cici158742 天前
MyBatis注解的运用于条件搜索实践
java·tomcat·mybatis
fenglllle2 天前
mybatis-plus SQL 注入漏洞导致版本升级引发的问题
数据库·sql·mybatis
C++chaofan2 天前
MyBatis - Plus学习笔记
java·spring boot·笔记·后端·mysql·架构·mybatis
只因在人海中多看了你一眼3 天前
B.40.3.2-MyBatis核心技术详解与性能优化
性能优化·mybatis
.又是新的一天.4 天前
健身房预约系统SSM+Mybatis(五、预约展示)
前端·mybatis