resultType 与 resultMap 基础映射
查询结果怎么变成 Java 对象?MyBatis 给了两条路:resultType 让框架按"列名 = 属性名"自动映射,省事;resultMap 手动声明"哪一列映射到哪个属性",精确但多写几行。先学自动映射,再学用 resultMap 解决"对不上"的问题。
自动映射:resultType
resultType 写结果元素类型(不是 List 类型!),返回多条时 MyBatis 自动包成 List:
<!-- 单条:User;多条:List<User>,写法都是 resultType="user" -->
<select id="selectAll" resultType="user">
SELECT id, name, age FROM user
</select>
自动映射规则(默认 autoMappingBehavior=PARTIAL,以官方文档为准):
- 列名与属性名忽略大小写后一致,即可映射:
id→id、name→name。 - 下划线列名配驼峰属性时,开启全局开关(settings):
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!-- user_name 列自动映射到 userName 属性 -->
<select id="selectById" resultType="user">
SELECT id, user_name, age FROM user WHERE id = #{id}
</select>
- 列名与属性对不上时,可用 SQL 别名救急:
SELECT user_name AS userName FROM user。 - 不想动实体也可以返回 Map:resultType="map" 时每一行是一个
Map<String,Object>,key 是列名(用 Map 时更要注意大小写与驼峰设置)。
手动映射:resultMap
列名实在对不上、需要类型转换、或要做复杂映射(第 7 章),就声明 resultMap:
<resultMap id="userMap" type="user">
<!-- id 子元素标记主键列,可提升性能 -->
<id property="id" column="id"/>
<!-- result 声明普通列 -->
<result property="name" column="user_name"/>
<result property="age" column="age"/>
</resultMap>
<select id="selectById" resultMap="userMap">
SELECT id, user_name, age FROM user WHERE id = #{id}
</select>
result/result 子元素常用属性:
| 属性 | 说明 |
|---|---|
| property | Java 属性名 |
| column | 数据库列名 |
| javaType | 属性类型(可省略,自动推断) |
| jdbcType | JDBC 类型(如 VARCHAR、INTEGER) |
| typeHandler | 类型处理器(列类型与 Java 类型互转) |
注意:resultType 与 resultMap 在同一个 select 上二选一,不能同时写。
显式映射与自动映射可以混用
resultMap 里只声明"需要特殊处理"的列,其余列仍会自动映射:
<resultMap id="userMap" type="user">
<!-- 只声明这一列特殊映射,id/age 交给自动映射 -->
<result property="name" column="user_name"/>
</resultMap>
resultMap 的复用
一个 resultMap 可以在多条语句上复用,还能用 extends 继承另一个 resultMap:
<resultMap id="userMap" type="user">
<id property="id" column="id"/>
<result property="name" column="user_name"/>
</resultMap>
<resultMap id="userMapExt" type="user" extends="userMap">
<result property="age" column="age"/>
</resultMap>
进阶提示
- 用构造函数注入字段时,用
<constructor><idArg/><arg/></constructor>子元素按顺序声明参数(以官方文档为准)。 <id>在关联/嵌套结果映射中用来判断"同一行对象",第 7 章会用到,先记住它的存在。
小结
字段整齐 → 无脑用 resultType(必要时开 mapUnderscoreToCamelCase 或写列别名);个别列对不上 → 建一个只声明特例列的 resultMap。自动映射省心,resultMap 兜底,两者混用是常见姿势。