摘要:介绍MyBatis 中Select标签的两个属性resultType和resultMap及其区别。

MyBatis常用动态标签大全见上述URL,它们大概分为如下四类:

标签 作用 使用场景
foreach 循环语句 批量添加或者批量查询
if 条件判断语句 单条件分支判断
choose、when、otherwise 类似 Java 中的 switch、case、default 语句 多条件分支判断
trim、where、set 辅助标签 用于处理一些条件查询

在MyBatis中有一个ResultMap标签,它是为了映射select标签查询出来的结果集,其主要作用是将实体类中的字段与数据库表中的字段进行关联映射。

前言

Mybatis 中 select 标签有两个属性 resultType 和 resultMap,用于在mapper.xml文件中配置返回结果类型,工作中经常使用到它们。那么在日常开发中,应该如何正确的选择呢?下面我们对这两个属性分别进行讲解和演示。

结果类型resultType

resultType直译就是结果的类型,可以设置为期望从select 语句中返回结果的类的全限定名或别名。resultType使用场景如下:

如果查询结果只是返回一个值,比如返回String、map或int,那么可以使用resultType指定简单类型作为输出结果。

我们先了解一个resultType的简单映射语句示例,它没有显式地指定 resultMap。比如:

<sql id="resultTypeColumn">
    id, username, hashedPassword
</sql>
<select id="selectUsers" resultType="map">
  select 
  	<include refid="resultTypeColumn"/>
  from some_table
  where id = #{id}
</select>

上述语句只是简单地将所有的列映射到 HashMap 的键上,这由 resultType 属性指定。此处对查询字段用了一个 sql 标签进行封装,该sql 片段可复用。

还有一种情况就是如果数据库表的字段名和实体bean对象的属性名一样。 虽然在大部分情况下都够用,但是 HashMap 并不是一个很好的领域模型;你的程序更可能会使用 JavaBean 或 POJO(普通老式 Java 对象)作为领域模型,MyBatis 对两者都提供了支持。看看下面这个 JavaBean:

package com.someapp.model;
public class User {
  private int id;
  private String username;
  private String hashedPassword;

 // omit getter,setter and toString
}

基于 JavaBean 的规范,上面这个类有 3 个属性:id,username 和 hashedPassword,它们会对应到 select 语句中的列名。这样的一个 JavaBean 可以被映射到 ResultSet,就像映射到 HashMap 一样简单。

<select id="selectUsers" resultType="com.someapp.model.User">
  select 
  <include refid="resultTypeColumn"/>
  from some_table
  where id = #{id}
</select>

类型别名是你的好帮手,关于如何设置类型别名,请移步《Spring Boot MyBatis使用type-aliases-package自定义类别名》。使用别名后就可以不用输入类的全限定名了。譬如:

<select id="selectUsers" resultType="User">
  select 
  <include refid="resultTypeColumn"/>
  from some_table
  where id = #{id}
</select>

在此情况下,MyBatis 会在幕后自动创建一个 resultMap,再根据属性名来映射列到 JavaBean 的属性上。如果列名和属性名不能匹配上,可以在 SELECT 语句中设置列别名(这是一个基本的 SQL 特性)来完成匹配。例如:

<sql id="resultTypeColumn">
    user_id             as "id",
    user_name           as "userName",
    hashed_password     as "hashedPassword"
</sql>
<select id="selectUsers" resultType="map">
  select 
  	<include refid="resultTypeColumn"/>
  from some_table
  where id = #{id}
</select>

注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。

结果映射resultMap

resultMap 直译就是结果映射,该元素是 MyBatis 中最重要最强大的元素。与 resultType 相比,resultMap就要强大许多,它不仅能够用于简单查询,还能用于级联查询以及设置缓存,功能可谓是十分的强大。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来,并在一些情形下允许你进行一些 JDBC 不支持的操作。实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份 resultMap 能够代替实现同等功能的数千行代码。ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。温馨提示:resultType 和 resultMap 之间只能同时使用一个。

resultMap标签属性

resultMap 标签的属性值包括两个:

  • id 属性:唯一标识,此 id 值用于 select 标签 resultMap 属性的引用。
  • type 属性:表示该 resultMap 的映射结果类型,可以为类的全限定名或者别名。

resultMap子标签包括如下几个 :

子标签 功能 备注
id 指定查询列中的唯一标识,如果有多个列组成唯一标识,配置多个id 可以不用
result 用于标识一些简单属性,包括column和property两个属性 常用
association 在主表的pojo中嵌套另一个表的pojo 不推荐使用
collection 把查询到的多条记录映射到集合对象 不推荐使用

result标签的属性包括两个:

  • column:数据库字段名或别名。
  • property:实体类中的属性,和column属性一一对应。

resultMap使用示例

下面使用一个简单的例子,来介绍 resultMap 的使用方法。虽然上一节中的例子不用显式配置 resultMap,但为了讲解,我们来看看如果显式使用外部的 resultMap 会怎样;这也是解决列名和bean名不匹配的另外一种方式。定义一个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>

然后在引用它的语句中设置 resultMap 属性就行了(注意我们去掉了 resultType 属性)。比如:

<select id="selectUsers" resultMap="userResultMap">
  select user_id, user_name, hashed_password
  from some_table
  where id = #{id}
</select>

resultType和resultMap的区别

下面了解一下MyBatis中数据转换机制:在进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以,其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis自动的把对应的值赋给resultType所指定对象的属性,而当提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己把它转化为对应的对象,这常常在复杂查询中很有作用。

言归正传,resultType和resultMap到底有什么区别呢?

resultType不需要配置,但是resultMap要配置一下。resultType是直接指定返回类型的,而使用resultMap时,需要在外部ResultMap标签中,设置数据库表的字段名和实体bean对象类的属性的一一对应关系。设置后,就算数据库的字段名和实体类的属性名不一样也没有关系,mybatis依然会给映射出来,所以resultMap要更强大一些。

就像上面说的那样,如果查询出来数据库字段名(包括字段别名)和要封装的实体bean对象属性值不相同时,只能使用resultMap来返回结果。

还有一个区别是resultMap可以用在复杂联合查询上,而resultType不可以。关于这一点,大家可以去Mybatis官网了解一下,这里点到为止。

结束语

至此,大家已经了解了resultType和resultMap的基本用法,在日常业务开发中已经可以游刃有余了。如果想更上一层楼,掌握更多关于resultMap的高级用法,请移步Mybatis官网。

当你遇到这个话题的时候,你通常怎么理解呢?你碰到过特别精彩、让人印象深刻的回答吗?欢迎大家积极留言交流。

Reference

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

https://baijiahao.baidu.com/s?id=1696473444790362129&wfr=spider&for=pc

到此这篇关于MyBatis标签之Select resultType和resultMap的文章就介绍到这了,更多相关MyBatis Select resultType和resultMap内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

MyBatis标签之Select resultType和resultMap详解的更多相关文章

  1. HTML5、Select下拉框右边加图标的实现代码(增进用户体验)

    这篇文章主要介绍了HTML5、Select下拉框右边加图标的实现代码,深度美化页面增进用户体验效果,需要的朋友可以参考下

  2. 在Sierra上,Brew安装错误单独使用Xcode是不够的

    我正在尝试使用HomeBrewv1.3.8在运行xCodev9.1的MacOSXSerrav10.12.6上安装软件包.安装和错误是然后我运行命令表示软件更新服务器无法使用命令行工具包.我进入xCode,它表明安装了命令行工具.任何帮助将非常感激.西奥解决方法我去了AppleDeveloper网站并直接下载了命令行工具dmg.首先需要设置Apple帐户.命令行工具可在以下位置找到–https://

  3. iOS 10 Safari问题在DOM中不再包含元素

    使用此链接,您可以重现该错误.https://jsfiddle.net/pw7e2j3q/如果您点击元素并从dom中删除它,然后单击链接测试.你应该看到旧的元素弹出选择.是否有一些黑客来解决这个问题?解决方法我能够重现这个问题.问题是,每当您尝试删除其更改事件上的选择框时,iOS10都无法正确解除对选择框的绑定.要解决此问题,您需要将代码更改事件代码放在具有一些超时

  4. iOS Chrome上的HTML SELECT不显示“完成”选项

    我们在iOS上的Chrome中使用UI呈现时遇到问题,特别是HTMLSELECTDropDown元素.例:使用Safari,当您点击SELECT时,屏幕底部会打开一个微调器–您可以点击完成以选择您的选择并返回到表单.但是,当您在iOS上的Chrome中加载完全相同的页面时,不会显示“完成”.用户必须选择他们的选择,然后点击UI上的其他位置返回到表单.非常不直观,用户感觉好像SELECT没有用.有人有解决方案吗?

  5. 安装命令行工具Xcode 5

    我已经尝试过并尝试过但我仍然无法解决问题.我正在尝试安装PebbleSDK1.12并安装Xcode5的命令行工具.每次我在终端尝试xcode-select–install时,我都会收到“无法安装软件,因为它目前在软件更新服务器中不可用”我试图重新安装Xcode,但是没有用.当我进入Xcode-preferences-downloads时,没有命令行工具的部分.我也试过从开发者网站安装它们但无济于事.下载看起来正确,然后我去Xcode看到首选项,并没有列出命令行工具.你们都能提出什么建议吗?

  6. ios – xcodebuild相当于Xcode的“产品&gt;构建&gt;测试”

    我正在尝试编写一个脚本,将iOS应用程序提交给AppThwack(一个“真正的设备”UI测试服务).他们的指导是使用XcodeGUI,并使用BuildFor>Xcode产品菜单中的测试选项.这是有效的,但我无法将其转换为xcodebuild等效项.更一般地说,我们如何确定Xcode传递给xcodebuild的什么参数(假设它使用该工具).解决方法现在可以从Xcode8开始(在写作时在beta版).

  7. xcode – 在REPL中创建目标Swift AST上下文时出错((null))

    在这里,我已经看到有关这个错误的几个的问题,但是没有一个提出的解决方案适用于我.这是我得到的这可能是也可能没有发生在我发出一些我不记得的命令之后.奇怪的是,如果我卸载Xcode,REPL开始正常工作.但是,如果我重新安装Xcode,错误就会回来.我在Xcode7.2.1,顺便说一句.思考?

  8. IOS设备问题与HTML表单输入(type = text)

    所以我有一个HTML登录表单与两个字段:电子邮件和密码.这些可以在除iOS设备之外的任何设备的浏览器上轻松填充.在IOS领域几乎不能关注焦点,一旦焦点,键盘弹出,我开始打字,但实际上没有填充.我已经尝试过Chrome和safari,仍然得到相同的结果.字段保持黑色.Bellow是我的格式如何格式化:请帮助!

  9. 我在哪里可以获得XCode的10.6 SDK

    我有SNowLeopard的测试版,我从DVD上安装了XCode,但它只安装了10.5和10.4SDK.我需要针对10.6构建以验证Apple的错误.解决方法ADCMemberSite.登录并选择下载.如果您是Premier或Select会员,那应该是您可以找到它的地方.如果您不是Premier或Select会员,您将看不到它.

  10. 在Android中选择视频的最佳方式是什么?

    我的照片里有一个完美的Intent.ACTION_PICK.startActivityForResult(newIntent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI),SELECT_IMAGE);但它不适用于视频.当我点击我的列表中的视频时,它会播放视频而不是发回给我.star

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部