resultMap
Mybatis中提供了resultMap功能,可以将数据库查询结果映射到Java对象,用于解决 字段名与属性名不一致 或 复杂关系(如一对多)的映射问题。
比如一个User类,在它的属性里还有另一个子对象(或者多个),可以是个List或者其他实体类,这个时候就需要用到
格式:
<resultMap type="User" id="userOrderMap">
type:要映射的实体类;id:给该resultMap定义一个唯一标识符。
id、result标签:用于映射指定的属性(不包含除String外的实体类对象),这两者的在映射上没有太多不同。id可以用于标识对象的主键字段,提升性能(MyBatis用主键判断对象是否重复)。
<resultMap id="" type="">
<id column="" property=""></id>
<result column="" property=""></id>
</resultMap>
column:对应表的列名
property:java对象的属性名
collection标签:用于映射一对多的子对象,比如将多条数据映射到某个集合中(集合的元素类型是某种实体类)。如果有点晕,就记得:给集合、map等类型的属性赋值,使用collection
<!-- 给list的属性赋值-->
<collection property="" ofType="">
<id column="" property=""></id>
<result column="" property=""></id>
</collection>
<!-- 给map属性赋值-->
<collection
property=""
javaType="java.util.HashMap" <!-- 固定为某个Map,此处写的是HashMap -->
ofType=""
keyColumn="" <!-- 指定作为Map键的列 -->
keyProperty="" <!-- 键值对中,值对象中作为键的属性 -->
>
<id column="" property=""/>
<result column="" property=""/>
</collection>
property:父对象中对应的子对象
ofType:子对象对应的数据类型,比如该子对象的数据类型是User类,那么此处就填写User。如果是给Map元素赋值,那么该属性的功能是指定 value 的数据类型
keyColumn:在映射Map类型数据时,用于指定key 的数据类型
给Map映射的内容,光描述比较抽象难懂,下面是个示例:
public class Order {
private Long id;
private String orderNumber;
private Map<Long, OrderItem> itemMap; // 键为商品ID,值为OrderItem对象
// Getters & Setters
}
public class OrderItem {
private Long id; // 与keyProperty="id"对应
private String name;
private Integer quantity;
// Getters & Setters
}
//映射后的数据结构
order.getItemMap() = {
1001: OrderItem(id=1001, name="商品A", quantity=2),
1002: OrderItem(id=1002, name="商品B", quantity=5)
}
<association>标签:
与使用collection标签映射List用法一致,只是将collection改成association即可。区别在于,collection是给集合中多个元素的属性进行赋值,association是给父对象的某一个子对象元素中的属性进行赋值。
示例:
<association property="user" javaType="User">
<id column="id" property="id"/>
<result column="username" property="name"/>
<result column="sex" property="sex"/>
<!-- 其他字段映射... -->
</association>