在 MyBatis 的 XML 映射文件里,resultMap和resultType都和查询结果的映射相关,不过它们的适用场景有明显不同。下面为你详细介绍它们各自的使用情况:
1. resultType的适用情况
resultType适用于下面这些场景:
- 返回简单数据类型:当查询结果是像
Integer、String、Long这样的单个值时,就可以使用resultType。xml
-
<select id="countUsers" resultType="java.lang.Integer"> SELECT COUNT(*) FROM users </select> - 返回 JavaBean 对象:若查询结果的列名和 JavaBean 的属性名完全一样,能直接进行映射,此时适合用
resultType。xml
-
<select id="getUserById" resultType="com.example.User"> SELECT id, username, email FROM users WHERE id = #{id} </select> - 返回 Map 对象:要是想把查询结果以键值对的形式返回,就可以把
resultType指定为map。xml
-
<select id="getUserMap" resultType="map"> SELECT id, username, email FROM users WHERE id = #{id} </select>
2. resultMap的适用情况
resultMap适用于以下场景:
- 列名和属性名不匹配:当数据库表的列名和 JavaBean 的属性名不一致时,就需要借助
resultMap来手动定义映射关系。xml
-
<resultMap id="UserResultMap" type="com.example.User"> <id property="id" column="user_id"/> <result property="username" column="user_name"/> <result property="email" column="user_email"/> </resultMap> <select id="getUserById" resultMap="UserResultMap"> SELECT user_id, user_name, user_email FROM users WHERE user_id = #{id} </select> - 处理复杂的关联映射:在处理一对一、一对多等复杂的对象关联关系时,必须使用
resultMap。- 一对一关联:
xml
- 一对一关联:
-
<resultMap id="OrderResultMap" type="com.example.Order"> <id property="id" column="order_id"/> <result property="orderNumber" column="order_number"/> <association property="user" javaType="com.example.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> </association> </resultMap> - 一对多关联:
xml
-
-
<resultMap id="UserResultMap" type="com.example.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <collection property="orders" ofType="com.example.Order"> <id property="id" column="order_id"/> <result property="orderNumber" column="order_number"/> </collection> </resultMap>
-
- 映射复合字段:当需要把多个列映射到 Java 对象的一个属性时,比如把
first_name和last_name合并映射到fullName属性,就要用到resultMap。xml
-
<resultMap id="UserResultMap" type="com.example.User"> <result property="fullName" column="{first=first_name,last=last_name}" select="com.example.UserMapper.getFullName"/> </resultMap>
3. 总结
- 使用
resultType的情况:查询结果简单,且列名和 Java 对象属性名能自动对应上时使用。 - 使用
resultMap的情况:查询结果复杂,或者需要手动定义列名和属性名的映射关系,以及处理对象间的关联关系时使用。
一般来说,resultType使用起来更简单便捷,而resultMap的功能更强大,能应对复杂的映射需求。
1437

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



