resultMap是MyBatis里面最复杂的元素,它的作用是定义映射规则、级联的更新、定制类型转化器等。
在实际的应用中,数据库中的实体存在三种基本的级联关系:
1、一对一关系
2、一对多关系
3、多对多关系
多对多关系在转化成物理表结构之后,可以分解为两个一对多的关系。那么在使用MyBatis时,如何处理“一对一关系”,“多对多关系”?
在MyBatis中,官方文档描述如下:
resultMap:
- constructor - 类在实例化时,用来注入结果到构造方法中
idArg - ID 参数;标记结果作为 ID 可以帮助提高整体效能
arg - 注入到构造方法的一个普通结果 - id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
- result – 注入到字段或 JavaBean 属性的普通结果
- association – 一个复杂的类型关联;许多结果将包成这种类型
嵌入结果映射 – 结果映射自身的关联,或者参考一个 - collection – 复杂类型的集
嵌入结果映射 – 结果映射自身的集,或者参考一个 - discriminator – 使用结果值来决定使用哪个结果映射
case – 基于某些值的结果映射
◾嵌入结果映射 – 这种情形结果也映射它本身,因此可以包含很多相 同的元素,或者它可以参照一个外部的结果映射。
代码片段……,一个resultMap的例子:
<resultMap id="productsResultMap" type="com.keymen.domain.Products">
<id column="productid" property="productid" jdbcType="VARCHAR" />
<result column="productname" property="productname" jdbcType="VARCHAR" />
<result column="productmemo" property="productmemo" jdbcType="VARCHAR" />
<result column="createtime" property="createtime" jdbcType="TIMESTAMP" />
<result column="updatetime" property="updatetime" jdbcType="TIMESTAMP" />
<result column="deletetime" property="deletetime" jdbcType="TIMESTAMP" />
<!-- 定义产品类型与产品的对应关系 ,一个产品类型对应多个产品,这是一对多的关系 -->
<association property="prodtype" resultMap="productsTypeResult" />
</resultMap>
关联
关联元素处理“有一个”类型的关系。比如,在我们的示例中,一个博客有一个用户。 关联映射就工作于这种结果之上。你指定了目标属性,来获取值的列,属性的 java 类型(很多情况下 MyBatis 可以自己算出来) ,如果需要的话还有 jdbc 类型,如果你想覆盖或获取的结果值还需要类型控制器。
关联中不同的是你需要告诉 MyBatis 如何加载关联。MyBatis 在这方面会有两种不同的 方式:
- 嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型。
- 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集。首先,然让我们来查看这个元素的属性。所有的你都会看到,它和普通的只由select 和resultMap 属性的结果映射不同。
下面通过实例在说明resultMap结果映射的关系(一对一)
需要提前准备的内容:
在MySQL数据库中,创建一个testdb数据库。再创建两张数据表:
- 产品类型表(tb_products_type)
- 产品表(tb_products)
其中包含的实体关系:每一个产品都有唯一的产品类型;而一类产品类型,包含多个产品。
创建数据表的SQL语句如下:
create table tb_products_type(
prodtypeid integer not null primary key,
prodtypename varchar(40) not null,
prodparentid integer,
createtime time,
updatetime time,
deletetime time
);
create table tb_products(
productid varchar(40) not null primary key,
prodtypeid integer not null,
productname varchar(80) not null,
productunit varchar(40),
productmemo varchar(100),
createtime time,
updatetime time,
deletetime time
);
需要注意的是,要在产品表(tb_products表)中的prodtypeid列上建外键(Foreign Key)。
向表中插入测试数据:
insert into tb_products_type values(1001,'Clothes',null,now(),null,null);