`
直线曲线
  • 浏览: 47159 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

ResultMap之复杂结果映射

阅读更多
快下班了,多么希望能来杯 啊。
昨天下班回去后,看了13集的东北往事,然后又开始了mybatis的探秘。之前也学习过Hibernate,经过这几日对mybatis的了解,感觉它的mapper的确很简洁很容易掌握,比hibernate的学习周期会短。

resultMap是否有必要配置,这要取决于你要映射的结果的复杂程度。
如果是column名称与类型与属性名称与类型能对应上,那么mybatis会自动的寻找到它,也就没有必要配置了。
但是对于复杂类型来说,resultMap是必须配置的,以帮助mybatis完成结果与类对象的映射。

简单内容学习完后,在小test中我也在想‘1对1’、‘1对多’的时候如何mapper呢?怀着这种疑问,开始学习mybatis的高级一些的配置。好了,下面列举一下ResultMap的高级使用,或说非常神奇的地方。官方文档称——“这是个神奇的‘网站’”,呵呵,玩笑而已,不过的却是非常XX。
首先列举一下resultMap中标签:
*constructor –  类在实例化时,用来注入结果到构造方法中
  **idArg – ID 参数;标记结果作为 ID 可以帮助提高整体效能
  **arg –  注入到构造方法的一个普通结果
*id –  一个ID 结果;标记结果作为ID 可以帮助提高整体效能
*result –  注入到字段或JavaBean 属性的普通结果
*association –  一个复杂的类型关联;许多结果将包成这种类型
  **嵌入结果映射  –  结果映射自身的关联,或者参考一个
*collection –  复杂类型的集
  **嵌入结果映射  –  结果映射自身的集,或者参考一个
*iscriminator –  使用结果值来决定使用哪个结果映射
  **case –  基于某些值的结果映射
  ***嵌入结果映射  –  这种情形结果也映射它本身,因此可以包含很多相
同的元素,或者它可以参照一个外部的结果映射。

下面讲一下理解后自我的了解:
constructor对应的是构造方法,可以为构造方法提供参数。需要强调——配置的参数的顺序与类型必须与类的构造方法的参数顺序与类型严格匹配。
idArg是constructor的参数标签,并且这个标签传递的应该是能唯一标识这个类实例的。可以理解为主键。
arg同样也是constructor的参数标签,传递非主键属性的数据。(能有若干个arg)。

id将指定列的数据映射到能唯一标识对应的属性上,可以理解为主键。若constructor中传递了idArg,所以这个id就可以省略了。

result用于映射列与普通类型的属性,若column名称和属性名称匹配的话,这个可以省去的,可以有若干个result。

association解决“有一个”的映射。例如类A的对象中有一个类B对象时,将结果映射到B对象中,利用这个标签就能迎刃而解了。
可以用“关联查询”和“关联结果”两个方式实现。我认为最佳方式是“关联结果”。
下面介绍这两种方式:
1、“关联查询”
例如:
<resultMap id=”blogResult” type=”Blog”> 
<association property="author" column="blog_author_id"  
javaType="Author" select=”selectAuthor”/> 
</resultMap> 
<select id=”selectBlog” parameterType=”int” resultMap=”blogResult”> 
SELECT * FROM BLOG WHERE ID = #{id} 
</select> 
<select id=”selectAuthor” parameterType=”int” resultType="Author"> 
SELECT * FROM AUTHOR WHERE ID = #{id} 
</select> 

注意association中的select属性,就是它告知mybatis完成‘author’的映射需要去找‘selectAuthor’这映射。其中‘blog_author_id’是作为‘selectAuthor’的参数。这种方式会导致“N+1”问题,所以不是最佳实践。

2、“关联结果”
例子:
<select id="selectBlog" parameterType="int" resultMap="blogResult"> 
select 
B.id as blog_id, 
B.title as blog_title, 
B.author_id as blog_author_id, 
A.id as author_id, 
A.username as author_username, 
A.password as author_password, 
A.email as author_email, 
A.bio as author_bio 
From Blog B left outer join Author A on B.author_id = A.id 
where B.id = #{id} 
</select> 

要注意sql语句中用到了联合查询方式join。是个重点哦。

映射部分如下:
<resultMap id="blogResult" type="Blog"> 
<id property=”blog_id” column="id" /> 
<result property="title" column="blog_title"/> 
<association property="author" column="blog_author_id" 
 javaType="Author" resultMap=”authorResult”/> 
</resultMap> 
<resultMap id="authorResult" type="Author"> 
<id property="id" column="author_id"/> 
<result property="username" column="author_username"/> 
<result property="password" column="author_password"/> 
<result property="email" column="author_email"/> 
<result property="bio" column="author_bio"/> 
</resultMap> 

注意association中的resultMap属性,映射‘author’时候会去找‘authorResult’映射。‘authorResult’映射中,可以注意到column的值都是上边的sql查询中的列名。如果想‘authorResult’这个映射能够重用,就可以如上设置。
另一种就是不打算重用,就可以如下实现了:
<association property="author" column="blog_author_id" 
 javaType="Author">
<id property="id" column="author_id"/> 
<result property="username" column="author_username"/> 
<result property="password" column="author_password"/> 
<result property="email" column="author_email"/> 
<result property="bio" column="author_bio"/> 
<association/> 


collection:用来处理映射对象中存在集合属性的情况。
其实现方式与association基本相似。注意collection的ofType属性,它表示集合中存放的类型,也就是集合映射的集合存放的类型。‘嵌套结果’作为最佳实践方式,首先介绍:
例子:
<select id="selectBlog" parameterType="int" resultMap="blogResult"> 
select 
B.id as blog_id, 
B.title as blog_title, 
B.author_id as blog_author_id, 
P.id as post_id, 
P.subject as post_subject, 
P.body as post_body, 
from Blog B 
left outer join Post P on B.id = P.blog_id 
where B.id = #{id} 
</select>

注意其中同样是应用了联合查询join。
映射例子:
<resultMap id="blogResult" type="Blog"> 
<id property=”id” column="blog_id" /> 
<result property="title" column="blog_title"/> 

<collection property="posts" ofType="Post"> 
<id property="id" column="post_id"/> 
<result property="subject" column="post_subject"/> 
<result property="body" column="post_body"/> 
</collection> 
</resultMap>

这个映射的具体属性映射就写在了collection中,如果要复用的话,可以提出来,用‘resultMap’替代之。

‘嵌套查询’的例子如下:
<resultMap id=”blogResult” type=”Blog”> 
<collection property="posts" javaType=”ArrayList” column="blog_id" 
ofType="Post" select=”selectPostsForBlog”/> 
</resultMap> 

<select id=”selectBlog” parameterType=”int” resultMap=”blogResult”> SELECT * FROM BLOG WHERE ID = #{id} 
</select> 

<select id=”selectPostsForBlog” parameterType=”int” resultType="Author"> 
SELECT * FROM POST WHERE BLOG_ID = #{id} 
</select>

‘blog_id’作为参数传递给了‘selectPostForBlog’。当然这也会引起“N+1”问题。


最后:由于mybatis能自动完成列与属性的映射,所以映射可以简写,但是这有前提——列名和属性名相似且属性对应。若果不满足条件就需要在映射中明确映射关系。


分享到:
评论
1 楼 guihaoming 2012-07-24  
谢谢,最近刚好在学习mybatis,看了你的明白了mybatis的复杂映射了

相关推荐

    mybatis-demo4-resultMap手动映射.zip

    在MyBatis中,ResultMap是核心配置之一,它用于定义如何将数据库查询结果映射到Java对象。ResultMap的概念是为了提高数据映射的灵活性和效率,避免了简单类型的数据映射过程中的冗余代码。在`mybatis-demo4-...

    mybatis3--4.resultMap高级映射

    在MyBatis中,ResultMap是核心配置之一,它提供了高级映射功能,使得我们可以更加灵活地处理数据库查询结果到Java对象的转换。本篇将深入探讨MyBatis中的ResultMap,包括其重要性、使用方式以及一些高级特性。 ...

    MyBatis的resultMap详解

    MyBatis 中的 resultMap 是一个非常重要的概念,它负责将查询结果映射到 Java 对象中。在 MyBatis 中,我们可以使用两种方式来指定查询结果的返回类型,一种是使用 resultType,另一种是使用 resultMap。其中,...

    Mybatis高级结果映射

    MyBatis 高级结果映射是其强大功能的核心之一,它允许开发人员灵活地将数据库查询结果映射到复杂的对象结构。在处理多表关联查询时,这种映射尤为重要,因为它可以有效地解决数据模型与数据库关系之间的差异。 在...

    第9章Mybatis映射篇之结果映射

    结果映射是Mybatis中将数据库查询结果转换为Java对象的过程,它是Mybatis动态SQL的强大特性之一,使得我们可以灵活地处理复杂的数据库查询结果。 首先,我们需要了解Mybatis的配置文件,其中包含了关于结果映射的...

    Mybatis resultMap

    ResultMap是Mybatis中的核心概念之一,它在处理复杂的数据库查询结果映射时扮演着重要角色。ResultMap的设计旨在提高灵活性,解决对象与数据库表之间的映射问题,尤其是在面对一对多、多对一或自关联等复杂关系时。 ...

    Mybatis系列教程Mybatis复杂映射开发共6页.p

    在处理复杂映射时,Mybatis提供了解决方案,如集合映射、嵌套结果映射、关联映射等,这些功能使得在ORM(对象关系映射)过程中能更高效地处理数据。 【描述】"Mybatis系列教程Mybatis复杂映射开发共6页.pdf.zip" ...

    MyBatis_sql-resultMap-缓存

    在MyBatis中,`resultMap`是核心配置元素之一,它定义了如何从数据库查询结果中映射数据到Java对象。而缓存机制则是MyBatis提高性能的重要特性,它可以避免不必要的数据库访问,提高应用响应速度。 **resultMap详解...

    MyBatis结果映射Collection.docx

    映射文件`CustomerMapper.xml`定义了一个名为`myCustomer`的结果映射,它使用了`&lt;resultMap&gt;`元素。这个结果映射指定了`Customer`类,并通过`&lt;id&gt;`和`&lt;result&gt;`元素映射了`id`和`name`属性。关键在于`&lt;collection&gt;`...

    根据MyBatis的ResultMap生成增删改sql

    ResultMap是MyBatis的核心组件之一,用于解决对象关系映射的复杂性,比如一对一、一对多、多对多等关联关系的处理。 首先,ResultMap的概念。ResultMap是MyBatis中定义的一种映射规则,用于解析查询结果并将其映射...

    mybatis教程之resultmap_动力节点Java学院整理

    ResultMap 的主要目的是简化复杂的语句,使开发者可以快速地将结果集映射到 Java 实体类中。 ResultMap 属性: * type:Java 实体类 * id:ResultMap 的标识 ResultMap 可以设置的映射: 1. constructor - ...

    MyBatis学习-映射文件标签篇(select、resultMap).rar_alikeett_blueaod_mybatis

    `resultMap`标签是MyBatis中一个非常强大的特性,它主要用于处理复杂的对象关系映射,比如一对一、一对多、多对多等。`resultMap`可以定义字段与对象属性之间的映射规则,避免了显式地写结果集转换代码。例如: ```...

    MyBatis源码:原来 resultMap解析完是这样.docx

    总的来说,`resultMap`的解析过程是MyBatis核心功能之一,它决定了数据库查询结果如何转换为Java对象,包括字段的映射、复杂对象的构建以及关联关系的处理。理解这个过程对于优化数据访问性能和提高代码可维护性至关...

    SQL语句映射文件

    2. **复杂映射** - **association**:用于处理一对一或多对一的关系。 - **collection**:用于处理一对多或多对多的关系。 - **discriminator**:基于某一列的值,决定使用哪一个`resultMap`。 - 示例: ```xml...

    mybatis分布查询以及resulttype和resultmap的用法

    - **resultMap**:`resultMap`则更加灵活,可以处理复杂的数据映射,包括一对一、一对多、多对一、多对多关系。例如,如果`User`类有一个`List&lt;Order&gt;`类型的属性`orders`,我们可以定义一个`resultMap`: ```xml...

    Mybatis高级映射查询

    7. 动态结果集映射:Mybatis 提供了动态结果集映射功能,通过 `&lt;collection&gt;` 和 `&lt;association&gt;` 标签可以处理复杂的一对多和多对一关系。例如,一个用户可能有多个订单,那么在查询用户时,可以将订单信息一同返回...

    MyBatis关联映射代码

    关联映射分为嵌套查询(Nested Select)和嵌套结果(Nested ResultMap)两种方式。 1. 嵌套查询:在查询主表数据时,通过子查询来获取关联的子表数据。这种方式通常用于一对多关系,例如一个用户有多个订单。在XML...

    MyBatis中关于resultType和resultMap的区别介绍

    在MyBatis中,`resultType` 和 `resultMap` 是两种不同的方式,用于处理SQL查询结果到Java对象的映射。理解它们的区别对于优化MyBatis映射文件的编写和提升代码的可维护性至关重要。 1. **resultType**: - `...

Global site tag (gtag.js) - Google Analytics