Mybatis resultMap扩展

本文介绍在 MyBatis 中如何通过扩展 BaseResultMap 来实现更复杂的查询需求,特别是多表联查场景下 resultMap 的配置方法。文章详细解释了在同一个文件内及跨文件扩展 resultMap 的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mybatis中,一般有个由mybatis generator自动生成的resultMap,ID为BaseResultMap。但该resultMap不能满足所有的情况,如多表联查的情况。因此得新增一个或多个的resultMap,由于要查询的field一般由该表所有field和其他表的部分field组成,所以可建立一个resultMap为ExtendResultMap。且该ExtendResultMap的建立可分为以下两种情况:

1、两者在同一个文件

这个很简单,一般都不会搞错。

例:

<resultMap id="ExtendResultMap" type="Java class" extends="BaseResultMap"></resultMap>

2、两者不在同一个文件

这个有时会因为写错路径而报扩展的resultMap找不到。

例:

<resultMap id="ExtendResultMap" type="Java class" extends="BaseResultMap所在xml的namespaceBaseResultMap"></resultMap>

备注:

路径为:xml的namespace+id


### MyBatisresultMap 处理父子关系的方法 在 MyBatis 中,`resultMap` 是用于定义如何将 SQL 查询结果映射到 Java 对象的强大工具。当涉及到父子关系时,可以利用 `association` 和 `collection` 标签来实现这种层次结构的映射。 #### 使用 association 映射一对一关系 如果存在一对一双向或多对一单向的关系,可以通过 `<association>` 来指定子对象与其父对象之间的联系。下面是一个具体的例子: 假设有一个博客(Blog)实体类及其作者(Author),其中每个 Blog 只有一位 Author,即构成了一对一的关系。为了表示这样的关系,在 XML 配置文件中会这样定义 `resultMap`: ```xml <resultMap id="blogResult" type="Blog"> <!-- 定义主键 --> <id property="id" column="blog_id"/> <!-- 定义其他简单属性 --> <result property="title" column="blog_title"/> <!-- 关联 author 表的数据 --> <association property="author" javaType="Author" resultMap="authorResult"/> </resultMap> <!-- 单独为 Author 创建一个 resultMap --> <resultMap id="authorResult" type="Author"> <id property="id" column="author_id"/> <result property="name" column="author_name"/> </resultMap> ``` 这里通过 `javaType` 属性指定了关联的对象类型,并且使用了另一个名为 `authorResult` 的 `resultMap` 来进一步细化 Author 类型的具体字段映射[^4]。 #### 使用 collection 映射一对多关系 对于一对多的情况,比如一个分类(Category)有多个文章(Post),则应该采用 `<collection>` 标签来进行映射。这通常发生在需要加载集合类型的成员变量上,例如 List 或 Set。 考虑 Category 和 Post 之间的一对多关系,可以在 Category 的 `resultMap` 中加入如下片段: ```xml <resultMap id="categoryResult" type="Category"> ... <collection property="posts" ofType="Post" resultMap="postResult"/> </resultMap> <resultMap id="postResult" type="Post"> <id property="id" column="post_id"/> <result property="title" column="post_title"/> </resultMap> ``` 在这个案例里,`ofType` 参数用来声明集合中的元素类型;同样地,也创建了一个独立的 `resultMap` (`postResult`) 来处理 Post 实体的细节。 需要注意的是,只有当子 `resultMap` 的 `type` 不是指定抽象类的情况下才能成功继承父 `resultMap` 的映射关系[^1]。这意味着如果尝试让某个具体类去扩展自定义基类或其他非最终 (non-final) 类作为其基础架构的一部分,则可能无法正常工作除非该特定子类确实实现了所有必要的接口或覆盖了必需的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值