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

相关推荐
天若有情6732 天前
SpringBoot4 + MyBatis 前后端分离实战|从零实现坏习惯管理系统,支持局域网手机访问CRUD
智能手机·mybatis
不能只会打代码2 天前
Day 011 — Spring 全家桶深度拆解
spring boot·mybatis·spring aop·spring mvc·spring ioc
憧憬成为web高手2 天前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
Java面试题总结4 天前
mybatis插件
java·tomcat·mybatis
Devin~Y5 天前
互联网大厂Java面试实战:Spring Boot、MyBatis、Redis、Kafka、JWT、Spring Cloud 与 AI 场景追问
java·spring boot·redis·spring cloud·kafka·mybatis·spring security
Ethan01075 天前
mybatis插件
mybatis
扎Zn了老Fe6 天前
MyBatis-Plus必知必会:告别低效CRUD,高效开发持久层
后端·mybatis
醉城夜风~6 天前
MyBatis 基础CRUD全套实战学习笔记
笔记·学习·mybatis
万亿少女的梦1686 天前
基于微信小程序、Spring Boot与Vue3的智慧养老管理系统设计与实现
spring boot·redis·微信小程序·mybatis·vue3
4154117 天前
MyBatis-Plus + PostGIS 实战(四):GeoJSON 序列化与前端地图对接,全局 WKT + 局部 GeoJSON,两种格式优雅共存
java·mybatis·postgis·geojson