mybatis中的resultMap,超详细讲解
使用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,超详细讲解相关推荐
- C++中构造函数的超详细讲解
C++在C语言的基础上增加了类和对象的概念,官方对类和对象的解释是:对象是类的实例化,类是对象的抽象,其实这个概念也很抽象,举一个简单的例子来说明这个关系: 在汽车生产车间我们要先画一张完整的汽车设计 ...
- 生存曲线 p值 python_超详细讲解生信SCI中的生存曲线作图,不看后悔系列
原标题:超详细讲解生信SCI中的生存曲线作图,不看后悔系列 在线及个性化精美Kaplan-Meier生存曲线的绘制 大家好,我是阿琛.俗话说,是骡子是马拉出来溜溜.在肿瘤研究中,一个基因的研究价值高不 ...
- python中逻辑运算符and,or的用法以及运算的核心思想——“短路逻辑”超详细讲解
python中and和or的用法以及运算的核心思想--"短路逻辑"超详细讲解 //本文几乎涵盖了and和or所有知识点,篇幅较长,一点要静下心来看,学无止境. 1.and和or的含 ...
- mybatis-plus超详细讲解
(6条消息) mybatis-plus超详细讲解_zdsg45的博客-CSDN博客_mybatis-plushttps://blog.csdn.net/zdsg45/article/details/1 ...
- Mybatis注解开发(超详细)
Mybatis注解开发 mybatis的常用注解 使用 Mybatis 注解实现基本 CRUD 项目目录结构 编写实体类 使用注解方式开发持久层接口 编写 SqlMapConfig.xml 配置文件 ...
- Python的零基础超详细讲解(第十三天)-Python的类与对象
基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...
- Python的零基础超详细讲解(第十二天)-Python函数及使用
基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...
- Python的零基础超详细讲解(第七天)-Python的数据的应用
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- Python的零基础超详细讲解(第五天)-Python的运算符
往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...
- python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上
Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...
最新文章
- 人工智能技术改变传统驾驶行为
- c语言数组中的字母可以相等吗,C语言数组比较
- AndroidStudio_你的主机中的软件中止了一个已建立的连接---Android原生开发工作笔记123
- 当个性化推荐遇上知识图谱.pdf(附下载链接)
- C++中传递数组参数
- Oracle优化避免索引失效
- 做有中国特色的项目管理
- SEM和SEO有什么区别,哪种更好一些
- Flutter 底部跟随键盘并且页面跟随键盘
- 模拟电子技术-模拟集成电路
- RBGA8888转nv21
- python考研成绩_出考研初试成绩之后
- 2月书讯 | 读新书,过新年。
- font-awesome图标显示问题解决方案
- 如何放大图像不模糊?图片无损放大
- 虾米音乐代码注释惊现 “穷逼 vip”,程序员要出来接锅了
- vue-router 3级路由
- 老人与海好词100英文带翻译_《老人与海 》英文版, 好词好句有哪些?
- 案例成果展 | 一朵“航空云”为国航APP核心业务保驾护航
- 怎么下载其他人的国家自然科学基金结题报告?
热门文章
- 联想服务器更改系统时间设置方法,怎么调整联想电脑的日期和时间
- 微信小程序实现加入购物车功能
- conceptd什么时候上市_iPhone12什么时候上市?iPhone12售价多少?
- 苹果概念手机_苹果游戏概念手机:两个屏幕+侧滑盖颠覆性设计,不仅仅只有这些...
- Arcgis制图之自制符号库
- photoshop唯美分割字,新手极容易入手!
- java数字转字符串的三种方式
- VS 代码自动对齐快捷键
- 游侠怎么设置java路径_使用小型虚拟机avian将Java转为本地程序
- VSM Studio uln2003驱动步进电机+单按键启保停正反转八拍控制