当前位置: 首页 > news >正文

3.结果映射ResultMap(关联association+collection)

结果映射ResultMap

一.结果映射

是 MyBatis 中最重要最强大的元素,简化代码,允许JDBC不支持的一些操作

1.常用属性

  1. constructor - 用于在实例化类时,注入结果到构造方法中 (一般不用)

  2. idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能

  3. arg - 将被注入到构造方法的一个普通结果

  4. id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能

  5. result – 注入到字段或 JavaBean 属性的普通结果

  6. association – 一个复杂类型的关联;许多结果将包装成这种类型(1对一时)

​ 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用

  1. collection – 一个复杂类型的集合(1对多时)

​ 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用

  1. discriminator – 使用结果值来决定使用哪个resultMap (一般不用)

    case – 基于某些值的结果映射

    嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射

2.id和result的属性 - 映射普通类型

属性描述
property映射到列结果的字段或属性。如果用来匹配的 JavaBean 存在给定名字的属性,那么它将会被使用
column数据库中的列名,或者是列的别名
javaType一个 Java 类的完全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型
jdbcTypeJDBC 类型,所支持的 JDBC 类型参见这个表格之后的“支持的 JDBC 类型”。
//id每个对象专有的标志    
//*id*元素对应的属性会被标记为对象的标识符,在比较对象实例时使用
<resultMap id="deptResultMap" type="dept">//column指定数据库字段名,property实体类中的属性名<id column="dept_id" property="deptId"/><result column="dept_name" property="deptName"/><result column="remark" property="remark"/><collection property="employees" ofType="employee"><id property="emp_id" column="emp_id"/><result property="emp_name" column="emp_name"/><result property="age" column="age"/><result property="sex" column="sex"/><result property="age" column="age"/><result property="dept_id" column="dept_id"/></collection></resultMap>
//deptResultMap与ResultMap标签中的id属性值一致,去掉resultType<select id="queryAll" resultMap="deptResultMap" resultType="emoloyees">select d.dept_id,dept_name,remark,emp_id,emp_name,age,sex,e.dept_idfrom dept dright join employee e on d.dept_id = e.dept_id</select>

当数据库列名和实体类属性名不能匹配上, 使用给变量赋值,就不用在sql语句中给字段名起别名,显示指定ResultMap来完成匹配功能

3.关联association

关联映射的是一个对象

1)分类:

MyBatis 有两种不同的方式加载关联:

  • 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
  • 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
2)常用属性
属性描述
property映射到列结果的字段或属性。如果用来匹配的 JavaBean存在给定名字的属性,那么它将会被使用。否则 MyBatis 将会寻找给定名称的字段。
javaType一个 Java 类的完全限定名,或一个类型别名。如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。
column数据库中的列名,或者是列的别名,如果需要嵌套查询,用来传参,一般和select一起用
select嵌套查询时传select的ID,它会从 column属性指定的列中检索数据,作为参数传递给目标 select 语句。
resultMap结果映射的 ID
4.集合 - collection

集合映射是一个集合,(1对多)

  • 嵌套 Select 查询:通过执行另外一个 SQL 映射语句来加载期望的复杂类型。
  • 嵌套结果映射:使用嵌套的结果映射来处理连接结果的重复子集。
1)常用属性
属性描述
property映射到列结果的字段或属性。
javaType用来匹配查询结果对应的java类型。一般都是ArrayList
column数据库中的列名,或者是列的别名,如果需要嵌套查询,用来传参,一般和select一起用,随便写个aa也可以
select嵌套查询时传select的ID,它会从 column属性指定的列中检索数据,作为参数传递给目标 select 语句。
resultMap结果映射的 ID
ofType映射集合的泛型,即集合里面存放的对象类型
        <collection property="employees" ofType="employee"><id property="emp_id" column="emp_id"/><result property="emp_name" column="emp_name"/><result property="age" column="age"/><result property="sex" column="sex"/><result property="age" column="age"/><result property="dept_id" column="dept_id"/></collection>

4.关联的分类

1)单向关联(一对1)

单向关联表示关系只在一个方向上存在,其中一个表可以关联到另一个表,但反过来不行。在单向关联中,只有一个表的对象包含了关联对象的引用,而关联对象本身不包含对关联表的引用。

单向关联的配置在MyBatis中非常简单,只需要在<resultMap>中使用<collection>或<association>标签来定义关联即可。

2)双向关联(一对多)

双向关联表示关系在两个表之间是相互关联的,每个表的对象都包含了对另一个表的引用。这样,我们可以通过一个表的对象访问到关联表的对象,也可以通过关联表的对象访问到原始表的对象

双向关联的配置相对复杂一些,需要在<resultMap>中使用<collection>或<association>标签来定义关联,并在关联对象中使用<association>标签来定义反向关联。

需要注意的是,无论是单向关联还是双向关联,都需要在MyBatis的映射文件中进行配置。关联的方向取决于我们在配置时定义的关联属性和关联对象的引用。

总结来说,MyBatis中的关系关联可以是单向关联或双向关联。单向关联表示关系只在一个方向上存在,而双向关联表示关系在两个表之间是相互关联的。在配置关系关联时,我们需要定义关联属性和关联对象的引用,以确定关联的方向。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 图像分割入门-SegNet理论与实践
  • Github绑定自己的域名
  • C语言 -- 操作符详解​
  • tableau气泡图与词云图绘制 - 8
  • 芯片基识 | 掰开揉碎讲 FIFO(同步FIFO和异步FIFO)
  • PID控制与模糊PID控制的比较
  • 预算有限?如何挑选经济适用的安全管理系统?
  • 识别色带后执行相应命令
  • Pandas在生物信息学中的应用详解
  • gazebo仿真环境中加入livox mid360
  • Oracle的主要特点是什么?应用场景有哪些?
  • 专业课笔记——(第九章:类的封装、继承、多态)
  • 使用 OpenCV 和 Python 进行车道检测和物体检测(YOLO)
  • 【多线程】Thread类的用法
  • 使用openssl生成公私钥并进行RSA加密
  • [Vue CLI 3] 配置解析之 css.extract
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【Leetcode】104. 二叉树的最大深度
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Angular 响应式表单之下拉框
  • Codepen 每日精选(2018-3-25)
  • express + mock 让前后台并行开发
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • node-glob通配符
  • nodejs实现webservice问题总结
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spring Boot快速入门(一):Hello Spring Boot
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • webpack4 一点通
  • 关于springcloud Gateway中的限流
  • 技术发展面试
  • 聊聊hikari连接池的leakDetectionThreshold
  • 聊聊sentinel的DegradeSlot
  • 前端之React实战:创建跨平台的项目架构
  • 如何设计一个比特币钱包服务
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 试着探索高并发下的系统架构面貌
  • 智能合约开发环境搭建及Hello World合约
  • - 转 Ext2.0 form使用实例
  • 【云吞铺子】性能抖动剖析(二)
  • AI算硅基生命吗,为什么?
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #数据结构 笔记三
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • %@ page import=%的用法
  • (2.2w字)前端单元测试之Jest详解篇
  • (Qt) 默认QtWidget应用包含什么?
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (四十一)大数据实战——spark的yarn模式生产环境部署