使用mybatis,有两个属性标签<resultType><resultMap>可以提供结果映射。

虽然resultType 属性在大部分情况下都够用,但是在一些特殊情况下无能为力,比如属性名和列名不一致,为一些连接的复杂语句编写映射代码。

遇到这些情况,我们要使用<resultMap>标签,一份 <resultMap> 能够代替实现同等功能的数千行代码。

resultMap 元素是 MyBatis 中最重要最强大的元素。
resultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。

属性名和列名不一致

这是开发过程中常见的情境,JavaBean 属性使用驼峰命名,数据库列名单词之间加入下划线。

public class User {private int id;private String username;private String hashedPassword;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getHashedPassword() {return hashedPassword;}public void setHashedPassword(String hashedPassword) {this.hashedPassword = hashedPassword;}
}
<select id="selectUsers" resultType="User">selectuser_id,user_name,hashed_passwordfrom some_tablewhere id = #{id}
</select>

为了解决上述问题,我们只需要在 <resultMap>中做一下简单的配置,然后在引用它的语句中设置 <resultMap> 属性就行了。

<resultMap id="userResultMap" type="User"><id property="id" column="user_id" /><result property="username" column="user_name"/><result property="password" column="hashed_password"/>
</resultMap>
<select id="selectUsers" resultMap="userResultMap">select user_id, user_name, hashed_passwordfrom some_tablewhere id = #{id}
</select>

注意:这里去掉了<reslutType>属性,用<resultMap>代替,二者只能选择其中的一个。

高级结果映射

MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。

我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样。

如果能有一种数据库映射模式,完美适配所有的应用程序,那就太好了,可惜没有。 而 ResultMap 就是 MyBatis 对这个问题的答案。

一对一映射

比如,我们如何映射下面这个语句?

<select id="selectBlogDetails" resultMap="detailedBlogResultMap">selectB.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,A.favourite_section as author_favourite_sectionfrom Blog Bleft outer join Author A on B.author_id = A.idwhere B.id = #{id}
</select>

这是典型的一对一的关联关系情况,我们通过<association>配置就可以解决这个问题。

<resultMap id="detailedBlogResultMap" type="Blog"><constructor><idArg column="blog_id" javaType="int"/></constructor><result property="title" column="blog_title"/><association property="author" 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"/><result property="favouriteSection" column="author_favourite_section"/></association>
</resultMap>

映射在 javaBean 中的表示:

private Author author;

接下来,我们一步一步来看这些元素的意义。

reslutMap 的属性

id:当前命名空间中的一个唯一标识,用于标识一个结果映射。
type:类的完全限定名, 或者一个类型别名。

id和result

id 和 result 元素都将一个列的值映射到一个简单数据类型(String, int, double, Date 等)的属性或字段。

这两者之间的唯一不同是,id 元素对应的属性会被标记为对象的标识符,在比较对象实例时使用。 这样可以提高整体的性能,尤其是进行缓存和嵌套结果映射(也就是连接映射)的时候。

两者的一些属性:

property:映射到列结果的字段或属性。
column:数据库中的列名,或者是列的别名。
javaType:一个 Java 类的全限定名,或一个类型别名。通常不会配置,mybatis 能够根据参数信息自动识别,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。
jdbcType:JDBC 类型,所支持的 JDBC 类型参见这个表格之后的“支持的 JDBC 类型”。

多对多映射

首先来看对应的 SQL 语句:

<select id="selectBlog" resultMap="blogResult">selectB.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 Bleft outer join Post P on B.id = P.blog_idwhere B.id = #{id}
</select>
<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>

javaBean 中我们这样表示集合:

private List<Post> posts;

大部分都和我们上面学习过的关联元素非常相似,这里只是新增了一个 ofType属性。

这个属性非常重要,它用来将 JavaBean(或字段)属性的类型和集合存储的类型区分开来。 所以你可以按照下面这样来阅读映射:

<collection property="posts" javaType="ArrayList" ofType="Post"/>

读作: “posts 是一个存储 Post 的 ArrayList 集合”。
在一般情况下,MyBatis 可以推断 javaType 属性,因此并不需要填写。所以很多时候你可以简略成:

<collection property="posts" ofType="Post"/>

高级关联和集合映射是一个深度话题。文章的介绍只能到此为止。配合少许的实践,你会很快了解全部的用法。

mybatis中的resultMap,超详细讲解相关推荐

  1. C++中构造函数的超详细讲解

    C++在C语言的基础上增加了类和对象的概念,官方对类和对象的解释是:对象是类的实例化,类是对象的抽象,其实这个概念也很抽象,举一个简单的例子来说明这个关系: 在汽车生产车间我们要先画一张完整的汽车设计 ...

  2. 生存曲线 p值 python_超详细讲解生信SCI中的生存曲线作图,不看后悔系列

    原标题:超详细讲解生信SCI中的生存曲线作图,不看后悔系列 在线及个性化精美Kaplan-Meier生存曲线的绘制 大家好,我是阿琛.俗话说,是骡子是马拉出来溜溜.在肿瘤研究中,一个基因的研究价值高不 ...

  3. python中逻辑运算符and,or的用法以及运算的核心思想——“短路逻辑”超详细讲解

    python中and和or的用法以及运算的核心思想--"短路逻辑"超详细讲解 //本文几乎涵盖了and和or所有知识点,篇幅较长,一点要静下心来看,学无止境. 1.and和or的含 ...

  4. mybatis-plus超详细讲解

    (6条消息) mybatis-plus超详细讲解_zdsg45的博客-CSDN博客_mybatis-plushttps://blog.csdn.net/zdsg45/article/details/1 ...

  5. Mybatis注解开发(超详细)

    Mybatis注解开发 mybatis的常用注解 使用 Mybatis 注解实现基本 CRUD 项目目录结构 编写实体类 使用注解方式开发持久层接口 编写 SqlMapConfig.xml 配置文件 ...

  6. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

  7. Python的零基础超详细讲解(第十二天)-Python函数及使用

    基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...

  8. Python的零基础超详细讲解(第七天)-Python的数据的应用

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  9. Python的零基础超详细讲解(第五天)-Python的运算符

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  10. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

最新文章

  1. 人工智能技术改变传统驾驶行为
  2. c语言数组中的字母可以相等吗,C语言数组比较
  3. AndroidStudio_你的主机中的软件中止了一个已建立的连接---Android原生开发工作笔记123
  4. 当个性化推荐遇上知识图谱.pdf(附下载链接)
  5. C++中传递数组参数
  6. Oracle优化避免索引失效
  7. 做有中国特色的项目管理
  8. SEM和SEO有什么区别,哪种更好一些
  9. Flutter 底部跟随键盘并且页面跟随键盘
  10. 模拟电子技术-模拟集成电路
  11. RBGA8888转nv21
  12. python考研成绩_出考研初试成绩之后
  13. 2月书讯 | 读新书,过新年。
  14. font-awesome图标显示问题解决方案
  15. 如何放大图像不模糊?图片无损放大
  16. 虾米音乐代码注释惊现 “穷逼 vip”,程序员要出来接锅了
  17. vue-router 3级路由
  18. 老人与海好词100英文带翻译_《老人与海 》英文版, 好词好句有哪些?
  19. 案例成果展 | 一朵“航空云”为国航APP核心业务保驾护航
  20. 怎么下载其他人的国家自然科学基金结题报告?

热门文章

  1. 联想服务器更改系统时间设置方法,怎么调整联想电脑的日期和时间
  2. 微信小程序实现加入购物车功能
  3. conceptd什么时候上市_iPhone12什么时候上市?iPhone12售价多少?
  4. 苹果概念手机_苹果游戏概念手机:两个屏幕+侧滑盖颠覆性设计,不仅仅只有这些...
  5. Arcgis制图之自制符号库
  6. photoshop唯美分割字,新手极容易入手!
  7. java数字转字符串的三种方式
  8. VS 代码自动对齐快捷键
  9. 游侠怎么设置java路径_使用小型虚拟机avian将Java转为本地程序
  10. VSM Studio uln2003驱动步进电机+单按键启保停正反转八拍控制