| 特性 | resultType | resultMap |
|---|---|---|
| 本質 | 別名/全限定類名,MyBatis 自動建構 ResultMap | 顯式定義的 <resultMap>,完全控制映射 |
| 適用場景 | 欄位名與屬性名一致(或別名對應)的簡單查詢 | 欄位名不一致、多表關聯、嵌套結果、緩存優化 |
| 靈活度 | 低(約定優於配置) | 高(配置優於約定) |
| 效能 | 首次查詢需反射構建映射,後續緩存 | 啟動時解析,運行零反射開銷 |
<select id="selectBlog" resultType="Blog">
SELECT id, title, content, owner FROM t_blog WHERE id = #{id}
</select>
MyBatis 內部:
ResultSetMap<String, Object>(列名→值)Blog,按 Property 名匹配 Map Key 賦值create_time,需開啟 mapUnderscoreToCamelCase=true 自動轉駝峰<resultMap id="blogMap" type="Blog">
<id property="id" column="id"/> <!-- 主鍵,影響 equals/hashCode -->
<result property="title" column="title"/>
<result property="content" column="content"/>
<result property="owner" column="owner"/>
</resultMap>
<select id="selectBlog" resultMap="blogMap"> ... </select>
<id>:標識主鍵列,對嵌套結果去重、緩存關鍵<result>:普通屬性映射column:SQL 列名/別名;property:Java 屬性名<resultMap id="commentMap" type="Comment">
<id property="id" column="id"/>
<result property="content" column="content"/>
<association property="blog" javaType="Blog"
select="selectBlog" column="blog_id"/> <!-- 子查詢 -->
</resultMap>
<select id="selectComment" resultMap="commentMap">
SELECT * FROM t_comment WHERE id = #{id}
</select>
<select id="selectBlog" resultType="Blog">
SELECT * FROM t_blog WHERE id = #{id}
</select>
column:將當前結果集的 blog_id 作為參數傳給 selectBlog 的 #{id}。
<resultMap id="blogMap" type="Blog">
<id property="id" column="id"/>
<result property="title" column="title"/>
<collection property="comments" ofType="Comment"
select="selectCommentsByBlog" column="id"/>
</resultMap>
<select id="selectBlog" resultMap="blogMap"> ... </select>
<select id="selectCommentsByBlog" resultType="Comment">
SELECT * FROM t_comment WHERE blog_id = #{blogId}
</select>
ofType:集合泛型類型(區別於 javaType)column 傳遞參數給子查詢<resultMap id="blogMap" type="Blog">
<id property="id" column="blog_id"/>
<result property="title" column="blog_title"/>
<collection property="comments" ofType="Comment">
<id property="id" column="comment_id"/>
<result property="content" column="comment_content"/>
</collection>
</resultMap>
<select id="selectBlogWithComments" resultMap="blogMap">
SELECT b.id blog_id, b.title blog_title, c.id comment_id, c.content comment_content
FROM t_blog b LEFT JOIN t_comment c ON b.id = c.blog_id
WHERE b.id = #{id}
</select>
單次查詢,MyBatis 按 <id> 分組自動聚合,避免 N+1 問題。
查詢類型 ├─ 簡單單表,列名≈屬性名 → resultType (最省事) ├─ 列名不一致/需轉換 → resultMap 基礎映射 ├─ 一對一/多關聯,可接受 N+1 → resultMap + select 子查詢 (延遲加載) ├─ 一對一/多關聯,高效能要求 → resultMap + 聯合查詢 (單 SQL) └─ 複雜多層嵌套/存儲過程 → resultMap + 自定義 ResultHandler
resultType 是「約定優於配置」的便捷入口,resultMap 是「配置優於約定」的終極武器。實際開發中:80% 場景用 resultType,20% 核心複雜查詢用 resultMap。掌握 <id>、<association>、<collection> 三大核心標籤與子查詢/聯合查詢兩種加載策略,即可駕馭所有映射場景。