实例解析:MyBatis中复杂resultMap结果映射

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);

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值