详解Mybatis中ResultType和ResultMap区别

在 MyBatis 中,resultTyperesultMap 都用于将 SQL 查询结果映射到 Java 对象中,但它们的用途和灵活性有所不同。

一、resultType

resultType 是 MyBatis 中一种简单且快捷的结果映射方式。它直接指定了查询结果应该映射到哪个 Java 类。

特点:
  • 简单易用: 适用于简单的映射场景,如查询结果与 Java 对象的字段名完全匹配。
  • 自动映射: MyBatis 会根据列名自动将结果集的字段映射到实体类的属性上。
  • 限制较多: 不能处理复杂的映射关系,如字段名与属性名不一致、嵌套对象映射、多对多关系映射等。
使用示例:
<select id="getUserById" parameterType="int" resultType="com.example.User">
    SELECT id, name, email FROM users WHERE id = #{id}
</select>

在这个例子中,MyBatis 会自动将 idnameemail 字段映射到 User 类的相应属性上。

二、resultMap

resultMap 是 MyBatis 提供的更为灵活和强大的结果映射方式。它允许你自定义复杂的映射规则,包括字段名和属性名不一致的情况、嵌套映射(将查询结果中的某些字段映射为对象属性)、以及处理一对多和多对多关系。

特点:
  • 灵活强大: 可以处理复杂的映射需求,如字段名与属性名不匹配、嵌套对象映射、一对多、多对多等。
  • 支持嵌套对象: 可以将结果集中的某些字段映射为 Java 对象的属性(嵌套对象)。
  • 自定义映射: 可以手动定义字段和属性之间的映射关系,甚至可以处理不同表之间的关联查询结果。
使用示例:
<resultMap id="userResultMap" type="com.example.User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
    <result property="email" column="user_email"/>
    <!-- 嵌套的对象映射 -->
    <association property="address" column="address_id" javaType="com.example.Address"
                 select="com.example.AddressMapper.getAddressById"/>
    <!-- 一对多映射 -->
    <collection property="orders" ofType="com.example.Order" 
                select="com.example.OrderMapper.getOrdersByUserId" column="user_id"/>
</resultMap>

<select id="getUserById" parameterType="int" resultMap="userResultMap">
    SELECT user_id, user_name, user_email, address_id FROM users WHERE user_id = #{id}
</select>

在这个例子中,resultMap 不仅定义了简单的字段到属性的映射,还处理了嵌套对象(address)以及一对多的关系(orders)。

三、区别总结:

  • 复杂度: resultType 适用于简单的映射场景,而 resultMap 用于更复杂的映射需求。
  • 灵活性: resultMap 提供了比 resultType 更高的灵活性,允许自定义映射规则和处理复杂的对象结构。
  • 使用场景: 如果查询结果与 Java 对象的字段名一致,且没有复杂的关系映射,使用 resultType 更简洁。如果需要处理嵌套对象、字段名不一致、多对多或一对多关系,使用 resultMap

四、什么时候用 resultType,什么时候用 resultMap

  • 使用 resultType 当查询结果集的字段名与 Java 类属性名一致,并且映射关系简单时,使用 resultType 可以简化配置。

  • 使用 resultMap 当需要自定义映射关系、字段名不一致、处理嵌套对象或复杂的关系(如一对多、多对多)时,使用 resultMap 提供更强大的功能和灵活性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值