在MyBatis中,resultType 和 resultMap 都是用来定义查询结果如何被映射到Java对象上的,但它们的使用场景和方式有所不同。
resultType
含义:
resultType 是一个简化的结果映射方式,用于直接将查询结果映射到一个已知类型的Java Bean或基本数据类型上。resultType 用于指定单个基本类型或简单对象类型(如String、Integer、自定义JavaBean等)作为查询结果的返回类型。
MyBatis会自动将查询结果的列名与Java Bean的属性名进行匹配(基于驼峰命名规则或别名),并将数据填充到对应的属性中。
示例:
假设有一个User类,包含id, username, email等属性,你可以这样使用resultType:
<select id="getUserById" parameterType="int" resultType="com.example.User">SELECT id, username, email FROM users WHERE id = #{id}
</select>
特点:
只能映射简单的基本类型或简单对象。
不支持复杂的映射需求,例如关联对象映射或嵌套结果集。
resultMap
含义:
resultMap 提供了一种更灵活和强大的结果映射方式,允许你定义复杂的映射关系,包括一对一、一对多、嵌套结果映射等。
当查询结果涉及多个表联查,或者列名与Java Bean属性名不一致时,resultMap特别有用。
通过id和result元素来指定哪些列映射到Java Bean的哪些属性上,还可以使用association和collection来处理关联对象的映射。
示例:
假设有User和Address两个类,User类中包含一个Address属性,可以这样定义resultMap:
<resultMap id="UserResultMap" type="com.example.User"><id property="id" column="user_id"/><result property="username" column="username"/><result property="email" column="email"/><association property="address" javaType="com.example.Address"><id property="addressId" column="address_id"/><result property="city" column="city"/><result property="street" column="street"/></association>
</resultMap><select id="getUserWithAddress" parameterType="int" resultMap="UserResultMap">SELECT u.user_id, u.username, u.email, a.address_id, a.city, a.streetFROM users u JOIN addresses a ON u.address_id = a.address_idWHERE u.user_id = #{id}
</select>
特点:
可以定义复杂的映射规则,包括主键映射、属性映射、关联对象映射等。
支持处理复杂的查询结果,适合处理多表关联查询或嵌套结果集。
区别总结:
- 适用范围:
-
- resultType 适用于简单的查询结果映射,通常用于返回基本类型或简单对象。
- resultMap 适用于复杂的查询结果映射,能够处理复杂的映射需求,如多表关联查询、嵌套结果集等。
- 配置方式:
-
- resultType 直接指定Java类或基本类型的全限定名。
- resultMap 需要在MyBatis配置文件中定义具体的映射规则。
- 灵活性:
-
- resultType 相对简单,但灵活性较差,不支持复杂映射。
- resultMap 灵活性强,可以定义复杂的映射规则,但配置较为复杂。