MyBatis ResultMap详解

MyBatis之ResultMap的association和collection标签详解 MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样。如果能有一种数据库映射模式,完美适配所有的应用程序,那就太好了,但可惜也没有。而 ResultMap 就是 MyBatis 对这个问题的答案。- 用于在实例化类时,注入结果到构造方法中idArg- ID 参数;标记出作为 ID 的结果可以帮助提高整体性能arg- 将被注入到构造方法的一个普通结果id– 一个 ID 结果; 阅读详情

MyBatis魔法堂:ResultMap详解

一、前言                               

  MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而resultMap就是结果集映射的配置标签了。

 

二、从SQL查询结果到领域模型实体                  

  在深入ResultMap标签前,我们需要了解从SQL查询结果集到JavaBean或POJO实体的过程。

  1. 通过JDBC查询得到ResultSet对象

  2. 遍历ResultSet对象并将每行数据暂存到HashMap实例中,以结果集的字段名或字段别名为键,以字段值为值

  3. 根据ResultMap标签的type属性通过反射实例化领域模型

  4. 根据ResultMap标签的type属性和id、result等标签信息将HashMap中的键值对,填充到领域模型实例中并返回

 

三、ResultMap标签                          

  1. 属性说明

     id属性 ,resultMap标签的标识。

     type属性 ,返回值的全限定类名,或类型别名。

     autoMapping属性 ,值范围true(默认值)|false, 设置是否启动自动映射功能,自动映射功能就是自动查找与字段名小写同名的属性名,并调用setter方法。而设置为false后,则需要在`resultMap`内明确注明映射关系才会调用对应的setter方法。

  2. 基本作用:建立SQL查询结果字段与实体属性的映射关系信息

      示例1:通过setter构造领域模型

复制代码
public class EStudent{
  private long id;
  private String name;
  private int age;
  // getter,setter方法

  /**
   * 必须提供一个无参数的构造函数
   */
  public EStudent(){}
}
复制代码
复制代码
<select id="getStudent" resultMap="getStudentRM">
  SELECT ID, Name, Age
    FROM TStudent
</select>
<resultMap id="getStudentRM" type="EStudnet">
  <id property="id" column="ID"/>
  <result property="studentName" column="Name"/>
  <result property="studentAge" column="Age"/>
</resultMap>
复制代码

  子元素说明:

     id元素 ,用于设置主键字段与领域模型属性的映射关系

     result元素 ,用于设置普通字段与领域模型属性的映射关系

  示例2:通过构造函数构造领域模型

复制代码
public class EStudent{
  private long id;
  private String name;
  private int age;
  // getter方法
  public EStudent(long id, String name, int age){
    this.id = id;
    this.name = name;
    this.age = age;
  }
}
复制代码
复制代码
<select id="getStudent" resultMap="getStudentRM">
  SELECT ID, Name, Age
    FROM TStudent
</select>
<resultMap id="getStudentRM" type="EStudnet">
  <constructor>
    <idArg column="ID" javaType="_long"/>
    <arg column="Name" javaType="String"/>
    <arg column="Age" javaType="_int"/>
  </constructor>
</resultMap>
复制代码

   子元素说明:

      constructor元素 ,指定使用指定参数列表的构造函数来实例化领域模型。注意:其子元素顺序必须与参数列表顺序对应

                                 idArg子元素 ,标记该入参为主键

                                 arg子元素 ,标记该入参为普通字段(主键使用该子元素设置也是可以的)

  3. 一对一关系、一对多关系查询请参考《MyBatis魔法堂:即学即用篇》

     注意:在采用嵌套结果的方式查询一对一、一对多关系时,必须要通过resultMap下的id或result标签来显式设置属性/字段映射关系,否则在查询多条记录时会仅仅返回最后一条记录的情况。

  4. 动态映射关系信息

    通过 discriminator子元素 (鉴别器)可以实现动态映射关系信息的设置。具体示例如下:

复制代码
public class EStudent{
  private long id;
  private String name;
  private String juniorHighSchool;
  private String seniorHighSchool;
  private int during; // 在本校就读时间
  // getter,setter方法

  /**
   * 必须提供一个无参数的构造函数
   */
  public EStudent(){}
}
复制代码

情景:查询学生信息的seniorHighSchool信息,若就读时间during字段值为4、5、6时,则以juniorHighSchool字段作所为seniorHighSchool信息。

复制代码
<select id="getStundent" resultMap="rm">
  SELECT ID, Name, JuniorHighSchool, SeniorHighSchool, during
    FROM TStudent
</select>
<resultMap id="rm" type="EStudent">
  // 若不加这句,则当将juniorHighSchool赋予给seniorHighSchool属性时,juniorHighSchool属性将为null
  <result column="juniorHighSchool" property="juniorHighSchool"/>

  <discriminator column="during" javaType="_int">
    // 形式1:通过resultType设置动态映射信息
    <case value="4" resultType="EStudent">
      <result column="juniorHighSchool" property="seniorHighSchool"/>
    </case>

   // 形式2: 通过resultMap设置动态映射信息
   <case value="5" resultMap="dynamicRM"/>
   <case value="6" resultMap="dynamicRM"/>
  </discriminator>
</resultMap>
<resultMap id="dynamicRM" type="EStudent">
  <result column="juniorHighSchool" property="seniorHighSchool"/>
</resultMap>
复制代码

  注意:上面关于 discriminator子元素 的 case元素 的 resultType属性 和 resultMap元素 的 type属性 ,均不是直指返回的领域模型类型,而是指定根据判断条件后得到映射关系,可通过 id子元素 和 result子元素 重写映射关系。

  5.  id元素,result元素,idArg元素,arg元素,discriminator元素的共同属性

        javaType属性 :Java类的全限定名,或别名

      jdbcType属性 :JDBC类型, JDBC类型为CUD操作时列可能为空时进行处理

        typeHandler属性 :指定类型处理器的全限定类名或类型别名

        column属性 :指定SQL查询结果的字段名或字段别名。将用于JDBC的 resultSet.getString(columnName) 

 

四、总结                                  

  掌握上述内容,那么在写一对一关系、一对多关系查询时就更有把握了哦!

  尊重原创来自:http://www.cnblogs.com/fsjohnhuang/p/4076592.html  

 

可信数据空间关键技术和功能架构研究 可信数据空间(TDS)是实现数据安全共享的基础设施,通过数字合约和使用控制技术确保数据跨域流通的可信与安全。其架构包括服务平台和接入连接器,关键技术涵盖访问控制、隐私计算、区块链等。评估重点在于合规性、连接器能力、互联互通及安全体系。核心在于构建规则引擎而非简单数据汇聚,连接器开发比平台建设更重要。当前面临技术成本博弈、跨域身份互认等挑战,需平衡安全、性能与成本,推动数据要素市场发展。 阅读详情

相关推荐

ubuntu虚拟机搭建OP-TEE

在网上找了一些搭建OP-TEE的过程,模仿着进行搭建,结果有好多报错,为了方便自己以后重新搭建,所以将整个过程记录下来。

weixin_44213847的博客 998

MyBatis魔法堂:ResultMap详解

一、前言                                  MyBatis是基于“数据库结构不可控”的思想建立的,也就是我们希望数据库遵循第三范式或BCNF,但实际事与愿违,那么结果集映射就是MyBatis为我们提供这种理想与现实间转换的手段了,而resultMap就是结果集映射的配置标签了。   二、从SQL查询结果到领域模型实体                     ...

weixin_33757911的博客 414

手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)

本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。

weixin_30831529的博客 294

MyBatis 所有的 jdbcType类型

MyBatis处理MySQL字段类型date与datetime 1) DATETIME 显示格式:yyyy-MM-dd HH:mm:ss 时间范围:[ '1000-01-01 00:00:00'到'9999-12-31 23:59:59'] 2) DATE 显示格式:yyyy-MM-dd 时间范围:['1000-01-01'到'9999-12-31'] 3) TIMESTAMP 显示格式:yyyy-MM-dd HH:mm:ss 时间范围:[ '1970-01-01 00:00:00'到'2037-12-

狗剩的专栏 7万+

网络攻防实验——网络监听

利用CAIN实现ARP监听。

Trieyes_of_feng的博客 3193

【CubeMX】STM32G474 HRTIM 互补PWM与死区时间配置实战

本文详细介绍了如何使用STM32CubeMX配置STM32G474的高分辨率定时器HRTIM生成互补PWM波形并精确设置死区时间。通过实战步骤讲解时钟配置、死区计算与高级功能,帮助工程师在电机驱动和电源应用中实现精准控制,避免上下桥臂直通风险。

grpc6streamer的博客 722

mybatis resultMap 里面的 jdbcType 有必要吗

因此,如果数据库中的字段类型与 Java 对象的属性类型不同,则可以在 ResultMap 中使用 jdbcType 来指定该字段的类型。例如,如果数据库中某个字段的类型为 VARCHAR,而 Java 对象的属性类型为 Integer,则在 ResultMap 中应该使用 jdbcType=“VARCHAR” 来告诉 MyBatis 将 Integer 类型的属性值转换为字符串类型插入到该字段中。因此,如果数据库中的字段类型和 Java 对象的属性类型一致,可以省略 jdbcType 属性。

weixin_43249535的博客 2485

YOLOv8 | 代码逐行解析(一) | 项目目录构造分析

Hello,大家好这次给大家带来的不是改进,是整个YOLOv8项目的分析,整个系列大概会更新7-10篇左右的文章,从项目的目录到每一个功能代码的都会进行详细的讲解,同时YOLOv8改进系列也突破了三十篇文章,最后预计本专栏持续更新会在年底更新上百篇的改进教程, 所以大家如果没有订阅专栏可以提前订阅以下。下面开始进行YOLOv8逐行解析的一篇——项目目录构造分析在这里给大家推荐我的YOLOv8改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,。

Snu77的博客 4万+

mybatis的jdbcType和javaType、oracle,MySQL的对应类型

JdbcType介绍 数据库列字段都是有类型的,不同的数据库有不同的类型。为了表示这些数据类型,Java源码是采用枚举来定义的: public enum JDBCType implements SQLType { TINYINT(Types.TINYINT), SMALLINT(Types.SMALLINT), INTEGER(Types.INTEGER) } ...

weixin_34292402的博客 4862

【我的Android进阶之旅】Android自定义View实现一个游戏摇杆,来实现监听遥动的方向或者监听摇动的角度的功能

一、需求描述 去年有个需求,需要使用自定义View实现一个游戏摇杆,来识别上下左右摇动的方向。 有点类似下面这样的王者荣耀游戏摇杆的效果 二、业界已有的参考资料 在下面这篇博客介绍了如何自定义游戏摇杆 2.1 博客介绍 Android自定义摇杆 2.1.1 功能 支持自适应大小 支持2个方向、4个方向、8个方向的摇动监听 支持摇动角度获取 可选回调模式 支持可摇动区域自定义 支持摇杆自定义 支持设置图片、色值、Shape图形 2.1.2 效果图 2.1.3 设置回调方式 setCallBac

字节卷动 1405

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

【深度学习|语义分割之UNet】如何使用ResNet50 作为 U-Net 网络的骨干网络(backbone)并使用预训练的 ResNet50 模型。附代码及解读。

985小水博的摸鱼日常 3089

mybatis中resultMap的理解

resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来, 并在一些情形下允许你做一些 JDBC 不支持的事情。 实际上,在对复杂语句进行联合映射的时候,它很可能可以代替数千行的同等功能的代码。 ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描述它们的关系就行了。你已...

谦虚使人发胖的博客 2万+

专为AI打造的浏览器:内存占用仅为Chrome的1/9、比Chrome快11倍(Docker部署教程,支持飞牛nas等服务器部署)

🚀 专为AI打造的无头浏览器来了! 用Zig从零构建,内存仅Chrome的1/9,速度快11倍,原生CDP协议支持Docker部署,适合爬虫、自动化测试和AI代理应用。✨

XiaoqiangClub的博客 729

MyBatis中resultMap详解

MyBatis 中 resultMap 详解 resultMap 是 Mybatis 最强大的元素之一,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。如在实际应用中,有一个表为(用户角色表),通过查询用户表信息展示页面,在(用户表)中存在用户角色表 id ,在实际列表页的展示中,用户关注的是用户角色名称,而不是角色 id。解决此类问题可以通过 resultMap 来映射自定义结果。 使用 resultMap 做自定义结果映射,字段名可以不一致,并且还可以指定要显示的列,比较灵活,应

weixin_49707895的博客 3万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于MyBatis中——resultMap详解

resultMap 1)自定义resultMap,实现高级结果集映射 2)id :用于完成主键值的映射 3)result :用于完成普通列的映射 4)association :一个复杂的类型关联;许多结果将包成这种类型 5)collection : 复杂类型的集 使用方式 1.select标签 定义resultMap 注意不是 resultType <select id="selectDE" resultMap="selectDE"> select d.deptid,d.

Daw3on的博客 2062

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

MyBatis resultMap元素详解

一、resultType和resultMap resultType resultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。 如果sql查询到的字段与pojo的属性名不一致,则需要使用resultMap将字段名和属性名对应起来,进行手动配置封装,将结果映射到pojo中 resultMap resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list实现一对一查询和一对多查询。 二、resul

m0_37965811的博客 2925

mybatis中的resultMap,超详细讲解

使用mybatis,有两个属性标签<resultType>、<resultMap>可以提供结果映射。虽然resultType 属性在大部分情况下都够用,但是在一些特殊情况下就无能为力,比如属性名和列名不一致,在为一些连接的复杂语句编写映射代码的时候。 这些情况,我们就要使用<resultMap>标签,一份 resultMap 能够代替实现同等功能的数千行代码。 resultMap 元素是 MyBatis 中最重要最强大的元素。 resultMap 的设计思想是,对简单的

cijiancao的博客 3万+

MyBatis ResultMap 详解

本文详细介绍了MyBatis中ResultMap的配置与使用。ResultMap是MyBatis核心元素,用于定义数据库结果集与Java对象间的映射关系。文章阐述了ResultMap的基本结构、核心元素(id、result、association、collection、discriminator)及其属性,并提供了完整的XML配置示例。重点讲解了简单映射、关联映射(一对一、一对多)、鉴别器映射和构造函数映射4种高级映射方法,每种方法都配有实际代码示例。

大家好,我是张小白! 1479

MyBatis中ResultMap的继承

假设有两个实体对象:A和B,其中B继承A。那么在定义B的ResultMap的时候,可以使用extends属性来继承A的ResultMap。 示例 有个实体对象FykUser:(get、set略) public class FykUser { private String id; private String loginName; } 然后另一个实体对象FykUserVo,继承FykUs...

fyk的博客 4716

MyBatis系列---resultMap

mybatis就是ssm中的m,后端开发中持久层最重要的组件,在此只讲述面试及开发过程中的核心点:<resultMap>。 resultMap 元素是 MyBatis 中最重要最强大的元素。它可以让你从 90% 的 JDBC ResultSets 数据提取代码中解放出来, 并在一些情形下允许你做一些 JDBC 不支持的事情。 实际上,在对复杂语句进行联合映射的时候,它很可能可以代替数千行的同等功能的代码。 ResultMap 的设计思想是,简单的语句不需要明确的结果映射,而复杂一点的语句只需要描

lipviolet的博客 1万+

mybatis的resultMap用法

resultMap元素是 MyBatis 中最重要最强大的元素。MyBatis 创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式,可惜它们并不都是那样。 如果能有一种数据库映射模式,完美适配所有的应用程序,那就太好了,但可惜也没有。 而 ResultMap 就是 MyBatis 对这个问题的答案。 代码中会出现大量重复,为了节省时间及空间,类型别名是好帮手。使用它们,就可以不用输入类的全限定名了。在mybatis的全局变量

qq_50896786的博客 7164

MyBatis的resultType和resultMap的区别

MyBatis中resultType与resultMap对比分析:resultType适用于字段名与属性名匹配的单表查询,配置简单但灵活性低;resultMap则支持自定义映射和复杂关联(一对一/一对多),功能强大但配置较复杂。建议简单查询用resultType,复杂关联用resultMap,并合理使用继承简化配置。两种方式各有适用场景,应根据查询需求选择,以平衡开发效率和维护成本。

ywl470812087的博客 13万+

MyBatis中ResultMap详解

简介: MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,将数据库中列数据复制到对象的相应属性上,可以用于复制查询,两者不能同时用。 resultMap 元素是 MyBatis 中最重要最强大的元素...

z19799100的博客 1万+

MyBatis:resultMap详解

简介:     MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,将数据库中列数据复制到对象的相应属性上,可以用于复制查询,两者不能同时用。   resultMap 元素是 MyBatis 中最...

weixin_30856965的博客 835

mybatis的resultMap配置详解

1、mybatis的实体类继承 参考资料:1、mybatis中实体类,po类继承另一个po类的情况 实体类的继承的作用是:可以通过继承减少代码在实体类中的重复使用,比如数据库的表中常常出现的字段所对应的实体类中的属性。 2、mybatis的resultMap标签中的属性extends,可以继承另外一个命名空间的resultMap标签。 <mapper namespace="xuecheng.dao.ACVSFundTest"> <resultMap id="res" extend

阿鹏 1389

mybatis的resultMap完美解析

在 select 语句中查询得到的是一张二维表, 水平方向上看是一个个字段, 垂直方向上看是一条条记录。作为面向对象的语言, Java 中的的对象是根据类定义创建的。类之间的引用关系可以认为是嵌套的关系。 在 mybatis 中, resultMap 节点定义了结果集和结果对象(JavaBean)之间的映射规则。 本文主要讲解的是 resultMap 的解析。 两个基础类 在阅读本文之前, 最好能对这两个类有相应的理解。 1.1、列映射类ResultMapping ...

风水道人 2266
上一篇: mybatis返回map结果集@MapKey使用场景
下一篇: Mybatis 关联查询
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值