ResultMap

发布于:2025-03-08 ⋅ 阅读:(95) ⋅ 点赞:(0)

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 用驼峰命名。
  • 复杂对象映射:处理嵌套对象、集合、继承等关系。
  • 性能优化:通过懒加载减少不必要的查询。
  • 自定义类型转换:如日期格式、加密字段等。

网站公告

今日签到

点亮在社区的每一天
去签到