在 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
的类型为 Item
,column
属性指定了关联的数据库字段 order_id
,select
属性指定了查询从对象的 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
的类型为 Address
,column
属性指定了关联的数据库字段 address_id
。
ResultMap 的应用场景
resultMap
可以应用于以下场景:
- 数据库字段名和 Java 属性名不一致: 例如,数据库表中字段名为
user_name
,而 Java 对象中属性名为username
,可以使用resultMap
将user_name
映射到username
。 - 存在多对一或一对多关系: 例如,一个用户可以有多个地址,可以使用
resultMap
将用户和地址关联起来。 - 需要进行数据转换: 例如,数据库表中存储的是时间戳,而 Java 对象中需要的是日期格式,可以使用
resultMap
进行数据转换。
求个点赞!!!求个点赞!!!求个点赞!!!