emanjusaka —— 彼岸花开可奈何

彼岸花开可奈何

微知识:ResultMap和ResultType的字段映射覆盖问题

2024-03-22

在MyBatis中,如果你使用resultType而不是resultMap,并且结果集中有同名字段,则默认情况下后出现的字段值会覆盖前面的字段值。这是因为MyBatis在将结果集映射到Java对象时,是按照字段名称一一对应进行赋值的。 但若你希望更精确地控制映射关系,并且避免自动覆盖行为,则可以用resultMap来显式指定每个字段应该映射到哪个属性上,它在遇到同名字段时不会进行覆盖,尤其是当涉及到多表查询时。 例如,如果有两个表中的字段名相同,你可以分别为它们起不同的别名:

 <select id="selectExample" resultMap="combinedResult">
     SELECT 
         t1.id as t1_id,
         t2.id as t2_id,
         ...
     FROM table1 t1
     LEFT JOIN table2 t2 ON t1.id = t2.t1_id
 </select>
 ​
 <resultMap id="combinedResult" type="YourJavaType">
     <id property="idFromTable1" column="t1_id"/>
     <!-- 其他来自table1的字段 -->
     <id property="idFromTable2" column="t2_id"/>
     <!-- 其他来自table2的字段 -->
 </resultMap>

这样通过column属性指定了数据库中的字段别名与Java实体类中属性的对应关系,即使字段名相同,也能确保正确映射到不同属性上而不会被覆盖。

在技术的星河中遨游,我们互为引路星辰,共同追逐成长的光芒。愿本文的洞见能触动您的思绪,若有所共鸣,请以点赞之手,轻抚赞同的弦。

原文地址: https://www.emanjusaka.top/2024/03/mybatis-resultmap-resulttype

微信公众号:emanjusaka的编程栈