快下班了,多么希望能来杯
啊。
昨天下班回去后,看了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能自动完成列与属性的映射,所以映射可以简写,但是这有前提——列名和属性名相似且属性对应。若果不满足条件就需要在映射中明确映射关系。
分享到:
相关推荐
mybatis-demo4-resultMap手动映射.zip
mybatis3--4.resultMap高级映射
在之前的章节中, 我们并未对返回结果做任何关系映射,但依然工作的很好,...但实际情况是mysql命名规则是**login_name**, 但java中却是**loginName**, 这就引出了mybatis的一个很强大的元素结果映射:**resultMap** .
详细说明了MyBatis的resultMap使用方法
4.resultMap –用来描述数据库结果集和对象的对应关系 5.sql – 可以重用的SQL块,也可以被其他语句引用 6.insert – 映射插入语句 7.update – 映射更新语句 8.delete – 映射删除语句 9.select – 映射查询语句
mybatis 一对多collection的使用 在mybatis如何进行一对多的多表查询呢?这里用一个简单的例子说明
MyBatis_sql-resultMap-缓存
MyBatis学习-映射文件标签篇(select、resultMap)
根据MyBatis的ResultMap生成增删改sql
读取mysql数据库,创建所有的Entity实体类,实体类里面有对应的注释,...mapper.xml文件里面配置了resultMap,实现字段映射 mapper.xml文件里面配置了insert语句,两个配置为了当数据特别多的时候,免去很多工作量。
读取mysql数据库,创建所有的Entity实体类,实体类里面有对应的注释,...mapper.xml文件里面配置了resultMap,实现字段映射 mapper.xml文件里面配置了insert语句,两个配置为了当数据特别多的时候,免去很多工作量。
NULL 博文链接:https://724073277.iteye.com/blog/1479584
mybatis中resultmap详细使用说明
SQL 映射XML 文件是所有sql语句放置的地方。需要定义一个workspace,一般定义为对应的接口类的路径。写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用。
resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,resultMap解决复杂查询是的映射问题。这篇文章主要介绍了Mybatis中的resultType和resultMap查询操作实例详解,需要的朋友可以参考下
主要介绍了mybatis教程之resultmap,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
resultMap 标签用来描述如何从数据库结果集中来加载对象,这篇文章重点给大家介绍mybatis中resultMap 标签的使用,感兴趣的朋友一起看看吧
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,那么MyBatis中关于resultType和resultMap的区别是什么呢?下面小编通过本文给大家解答下
详解MyBatis框架中SQL映射文件的具体配置,包括实现增删改查操作、根据主键生成方式获取主键值、针对单个参数、多个参数和命名参数的处理与参数值获取以及select标签中resultMap的详解