ResultMap映射讲解-Mybatis

在 MyBatis 中,resultMap用于自定义结果映射,解决数据库字段和 Java 对象属性之间不匹配的问题。它允许:

  • 自定义映射关系: 灵活地将数据库查询结果映射到 Java 对象的属性,即使数据库字段名和 Java 属性名不一致,或者存在多对一、一对多等复杂关系。
  • 提高代码可读性: 通过 resultMap,你可以将复杂的映射关系定义在 XML 配置文件中,使代码更加清晰易懂。
  • 提高代码可维护性: 当数据库表结构发生变化时,你只需要修改 resultMap 的配置,而不需要修改 Java 代码,提高了代码的可维护性。

ResultMap支持复杂的映射,包括一对一、一对多和多对多的关系映射。 

ResultMap 的结构 

<resultMap id="userResultMap" type="com.example.User">
  <id column="id" property="id"/>
  <result column="username" property="username"/>
  <result column="password" property="password"/>
  <result column="age" property="age"/>
  <association property="address" javaType="com.example.Address" column="address_id">
    <id column="address_id" property="id"/>
    <result column="street" property="street"/>
    <result column="city" property="city"/>
  </association>
</resultMap>
  • id: resultMap 的唯一标识符。(填数据库中的表的主键
  • type: 要映射的 Java 对象类型。
  • id column: 数据库表中主键字段名。
  • id property: Java 对象中主键属性名。
  • result column: 数据库表中其他字段名。
  • result property: Java 对象中其他属性名。
  • association: 用于映射一对一或多对一关系,可以嵌套其他 resultMap
  • collection: 用于映射一对多或多对多关系,可以嵌套其他 resultMap

 MyBatis 提供了 association 和 collection 元素来实现一对一和一对多关系的映射。

一对多映射

一对多映射是指一个对象对应多个其他对象,例如一个订单可以包含多个商品。

public class Order {
  private Integer id;
  private String orderNo;
  private List<Item> items;

  // getter and setter methods
}

public class Item {
  private Integer id;
  private String name;
  private Double price;
  private Integer quantity;

  // getter and setter methods
}

映射文件 orderMapper.xml 中的 ResultMap 定义如下: 

<resultMap id="orderResultMap" type="com.example.Order">
  <id column="id" property="id"/>
  <result column="order_no" property="orderNo"/>
  <collection property="items" ofType="com.example.Item" column="order_id" select="selectItemsByOrderId">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="price" property="price"/>
    <result column="quantity" property="quantity"/>
  </collection>
</resultMap>

<select id="selectItemsByOrderId" resultMap="itemResultMap">
  SELECT * FROM item WHERE order_id = #{orderId}
</select>

<resultMap id="itemResultMap" type="com.example.Item">
  <id column="id" property="id"/>
  <result column="name" property="name"/>
  <result column="price" property="price"/>
  <result column="quantity" property="quantity"/>
</resultMap>

在 orderResultMap 中,collection 元素用于映射 items 属性,ofType 属性指定了 items 的类型为 Itemcolumn 属性指定了关联的数据库字段 order_idselect 属性指定了查询从对象的 SQL 语句 selectItemsByOrderId

一对一映射

一对一映射是指一个对象对应另一个对象,例如一个用户对应一个地址。

public class User {
  private Integer id;
  private String username;
  private Address address;

  // getter and setter methods
}

public class Address {
  private Integer id;
  private String street;
  private String city;

  // getter and setter methods
}

映射文件 userMapper.xml 中的 resultMap 定义如下:

<resultMap id="userResultMap" type="com.example.User">
  <id column="id" property="id"/>
  <result column="username" property="username"/>
  <association property="address" javaType="com.example.Address" column="address_id">
    <id column="address_id" property="id"/>
    <result column="street" property="street"/>
    <result column="city" property="city"/>
  </association>
</resultMap>

在 userResultMap 中,association 元素用于映射 address 属性,javaType 属性指定了 address 的类型为 Addresscolumn 属性指定了关联的数据库字段 address_id

ResultMap 的应用场景

resultMap 可以应用于以下场景:

  • 数据库字段名和 Java 属性名不一致: 例如,数据库表中字段名为 user_name,而 Java 对象中属性名为 username,可以使用 resultMap 将 user_name 映射到 username
  • 存在多对一或一对多关系: 例如,一个用户可以有多个地址,可以使用 resultMap 将用户和地址关联起来。
  • 需要进行数据转换: 例如,数据库表中存储的是时间戳,而 Java 对象中需要的是日期格式,可以使用 resultMap 进行数据转换。

求个点赞!!!求个点赞!!!求个点赞!!!

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值