在 MyBatis 中,resultType
和 resultMap
都用于将 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 会自动将 id
、name
、email
字段映射到 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
提供更强大的功能和灵活性。