ResultMap
resultMap
是 MyBatis 中用于映射数据库查询结果到 Java 对象的核心配置工具。它允许开发者灵活地定义数据库字段与 Java 对象属性之间的对应关系,尤其适用于字段名与属性名不一致、处理复杂对象关系(如嵌套对象或集合)等场景。
1. 基础用法
当数据库字段名与Java对象属性名不一致时,可以通过ResultMap显式映射。
示例:
<resultMap id="userResultMap" type="User">
<!-- 主键字段用 id 标签 -->
<id property="id" column="user_id"/>
<!-- 普通字段用 result 标签 -->
<result property="username" column="user_name"/>
<result property="email" column="user_email"/>
</resultMap>
<select id="selectUser" resultMap="userResultMap">
SELECT user_id, user_name, user_email FROM users
</select>
- id:唯一标识该resultMap
- type:目标Java对象类型(如User类)
- property:Java对象的属性名
- column:数据库查询结果的列名
2. 处理关联关系
2.1 一对一(<assosiation>)
映射一个对象中的另一个属性(如User包含address)
<resultMap id="userWithAddressMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
<!-- 嵌套映射 Address 对象 -->
<association property="address" javaType="Address">
<result property="street" column="address_street"/>
<result property="city" column="address_city"/>
</association>
</resultMap>
2.2 一对多(<collection>)
映射一个对象中的集合属性(如User包含多个Order)
<resultMap id="userWithOrdersMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
<!-- 嵌套映射 Order 集合 -->
<collection property="orders" ofType="Order">
<id property="orderId" column="order_id"/>
<result property="amount" column="order_amount"/>
</collection>
</resultMap>
- ofType:集合中元素的类型(如Order类)
2.3 自动映射(autoMapping)
如果属性名与字段名大部分一致,可以启用自动映射,减少冗余配置
<resultMap id="userResultMap" type="User" autoMapping="true">
<!-- 仅需显式配置不一致的字段 -->
<result property="username" column="user_name"/>
</resultMap>
- autoMapping="true":自动映射同名字段
- 显式配置覆盖:如果某字段需要特殊处理,仍可手动定义
2.4继承重用(extends)
通过继承已有的resultMap,避免重复配置
<resultMap id="baseUserMap" type="User">
<id property="id" column="user_id"/>
<result property="username" column="user_name"/>
</resultMap>
<!-- 继承 baseUserMap,并添加新字段 -->
<resultMap id="detailedUserMap" extends="baseUserMap" type="User">
<result property="email" column="user_email"/>
</resultMap>
3. 使用场景
- 字段名与属性名不一致:例如数据库用下划线命名,Java 用驼峰命名。
- 复杂对象映射:处理嵌套对象、集合、继承等关系。
- 性能优化:通过懒加载减少不必要的查询。
- 自定义类型转换:如日期格式、加密字段等。