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

news/2024/7/24 12:42:25 标签: 数据库, mybatis, mysql, java, intellij-idea

结果映射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_id
        from dept d
                 right 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中的关系关联可以是单向关联或双向关联。单向关联表示关系只在一个方向上存在,而双向关联表示关系在两个表之间是相互关联的。在配置关系关联时,我们需要定义关联属性和关联对象的引用,以确定关联的方向。


http://www.niftyadmin.cn/n/5546981.html

相关文章

C语言 结构体和共用体——结构体和数组的嵌套

目录 结构体和数组的相互嵌套​编辑 嵌套的结构体 嵌套结构体变量的初始化 结构体数组的定义和初始化 结构体和数组的相互嵌套 嵌套的结构体 在一个结构体内包含了另一个结构体作为其成员 嵌套结构体变量的初始化 STUDENT stu1 {100310121, " 王刚 ", M, {1991…

liunx清理服务器内存和日志

1、查看服务器磁盘占用情况 # 查看磁盘占用大小 df -h 2、删除data文件夹下面的日志 3、查看每个服务下面的日志输出文件&#xff0c;过大就先停掉服务再删除out文件再重启服务 4、先进入想删除输入日志的服务文件夹下&#xff0c;查看服务进程&#xff0c;杀掉进程&#xff…

论文阅读 - Intriguing properties of neural networks

Intriguing properties of neural networks 经典论文、对抗样本领域的开山之作 发布时间&#xff1a;2014 论文链接: https://arxiv.org/pdf/1312.6199.pdf 作者&#xff1a;Christian Szegedy, Wojciech Zaremba, Ilya Sutskever, Joan Bruna, Dumitru Erhan, Ian Goodfellow,…

每日复盘-20240709

今日关注: 20240709 六日涨幅最大: ------1--------300391--------- 长药控股 五日涨幅最大: ------1--------300391--------- 长药控股 四日涨幅最大: ------1--------603155--------- 新亚强 三日涨幅最大: ------1--------301300--------- 远翔新材 二日涨幅最大: ------1-…

第5章 Vite高级功能(二)

文章目录 6 缓存和持久化6.1 配置缓存目录 7 压缩与最小化7.1 启用压缩7.2 配置压缩选项 8 生产环境优化8.1 移除调试信息8.2 配置环境变量 9 静态资源优化9.1 压缩图像9.2 合并和压缩 CSS9.3 使用 HTTP/2 10 分析构建结果10.1 使用分析插件10.2 生成包分析报告 6 缓存和持久化…

cmake find_package 使用笔记

目录 1 find_package2 config mode2.1 搜索的文件名2.2 搜索路径 3 module mode3.1 搜索的文件名3.2 搜索路径 参考 1 find_package 这是官方文档 下面是学习总结&#xff1a; 首先是find_package的作用是什么&#xff1f;引入预编译的库。 find_package有两种模式&#xff1a…

架构设计(2)云原生架构与实例部署

云原生架构 云原生架构是一种面向云环境设计和构建应用程序的方法论&#xff0c;旨在充分利用云计算的优势&#xff0c;如弹性、自动化和可扩展性&#xff0c;以实现更高效、可靠和灵活的应用部署和管理。以下是云原生架构的核心理念和关键特点&#xff1a; 核心理念&#xf…

fatal error: NvInfer.h: No such file or directory 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 一、问题描述 编译调用 tensorrt 的程序时&#xff0c;出现如下报错&#xff1a; fatal error: NvInfer.h: No such file or directory7 | #include <NvInfer.h>…