在 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提供更强大的功能和灵活性。
2682

被折叠的 条评论
为什么被折叠?



