实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系。针对多表之间的操作,MyBatis提供了关联映射,

通过关联映射就可以很好的处理对象与对象之间的关联关系。

1.1 关联关系概述

在关系型数据库中,多表之间存在着三种关联关系,分别为一对一、一对多和多对多,如下图所示:



三种关系如下:

  • 一对一:在任意一方引入对方主键作为外键。

  • 一对多:在“多”的一方,添加“一”的一方的主键作为外键。

  • 多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。

在Java中,通过对象也可以进行关联关系描述,如图下图所示:

  • 一对一的关系:就是在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a。

  • 一对多的关系:就是一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a。

  • 多对多的关系:在A类中定义B类类型的集合,在B类中定义A类类型的集合。

1.2 一对一

在现实生活中,一对一关联关系是十分常见的。例如,一个人只能有一个身份证,同时一个身份证也只会对应一个人

<resultMap>元素中,包含了一个<association>子元素,MyBatis就是通过该元素来处理一对一关联关系的。

在<association>元素中,通常可以配置以下属性:

  • property:指定映射到的实体类对象属性,与表字段一一对应;

  • column:指定表中对应的字段;

  • javaType:指定映射到实体对象属性的类型;

  • select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询;

  • fetchType:指定在关联查询时是否启用延迟加载。该属性有lazy和eager两个属性值,默认值为lazy(即默认关联映射延迟加载)。

MyBatis加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。

  • 嵌套查询:嵌套查询是通过执行另外一条SQL映射语句来返回预期的复杂类型。

      嵌套查询是在查询SQL中嵌入一个子查询SQL;
    
      嵌套查询会执行多条SQL语句;
    
      嵌套查询SQL语句编写较为简单;
  • 嵌套结果:嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。

      嵌套结果是一个嵌套的多表查询SQL;
    
      嵌套结果只会执行一条复杂的SQL语句;
    
      嵌套结果SQL语句编写比较复杂;

虽然使用嵌套查询的方式比较简单,但是嵌套查询的方式要执行多条SQL语句,这对于大型数据集合和列表展示不是很好,

因为这样可能会导致成百上千条关联的SQL语句被执行,从而极大的消耗数据库性能并且会降低查询效率。

使用<association>元素进行一对一关联映射非常简单,只需要参考如下两种示例配置即可。

  • 嵌套查询,property指的是类属性,column指的是表字段,select表示嵌套的子查询,javaType表示关联属性类型。
<association property="card" column="card_id"
javaType="com.itheima.po.IdCard" select="com.itheima.mapper.IdCardMapper.findCodeById" />
  • 嵌套结果,property指的是类属性,column指的是表字段,javaType表示关联属性类型。
<association property="card" javaType="com.itheima.po.IdCard">
<id property="id" column="card_id" />
<result property="code" column="code" />
</association>

1.3 一对多

开发人员接触更多的关联关系是一对多(或多对一)。例如,一个用户可以有多个订单,同时多个订单归一个用户所有。

<resultMap>元素中,包含了一个<collection>子元素,MyBatis就是通过该元素来处理一对多关联关系的。

<collection>子元素的属性大部分与<association>元素相同,但其还包含一个特殊属性--ofType 。

  • ofType:ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。

<collection>元素的使用也非常简单,同样可以参考如下两种示例进行配置,具体代码如下:

  • 嵌套查询,property指的是类属性,column指的是表字段,select表示嵌套的子查询,ofType表示关联的集合类属性类型。
<collection property="ordersList" column="id" ofType="com.itheima.po.Orders"
select=" com.itheima.mapper.OrdersMapper.selectOrders" />
  • 嵌套结果,property指的是类属性,column指的是表字段,ofType表示关联的集合类属性类型。
<collection property="ordersList" ofType="com.itheima.po.Orders">
<id property="id" column="orders_id" />
<result property="number" column="number" />
</collection>

1.3 多对多

在实际项目开发中,多对多的关联关系也是非常常见的。以订单和商品为例,一个订单可以包含多种商品,而一种商品又可以属于多个订单

在数据库中,多对多的关联关系通常使用一个中间表来维护,中间表中的订单id作为外键参照订单表的id,商品id作为外键参照商品表的id。



在MyBatis中,多对多的关联关系查询,同样可以使用前面介绍的 <collection>元素进行处理(其用法和一对多关联关系查询语句用法基本相同)。

小结

主要学习了MyBatis中的数据表之间以及对象之间的关联关系,以及MyBatis框架中对关联关系的处理。

以上内容是根据Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)做的一些笔记和总结。

Mybatis的关联映射的更多相关文章

  1. 04—mybatis的关联映射

    mybatis的关联映射一对一一对多多对多 一.一对一(一个人只能有一个身份证号) 1.创建表创建表tb_card CREATE TABLE `tb_card` ( `id` int(11) NOT ...

  2. mybatis 一对一关联映射实例

    在实际项目开发中,经常存在一对一的关系,如一个人对应一张身份证信息,这就是一对一的关系.下面是一个简单的实例: 1.建表过程我就省略了,主要是一张Person表,一张IDCard表,其相关属性见步骤2 ...

  3. mybatis之关联映射

    ###mybatis使用之一对一关联映射 1)分析并画ER图.(特别是一对一.一对多.多对多的情况) 2)启动终端数据库,并建库建表,在表中插入值和字段,并查看结果.(后期把navicat用上) 3) ...

  4. Mybatis的关联映射案例

    主要是对之前学习的关联映射做一个案例,自己动手实践一下,可以理解的更好一点. 开发环境 开发工具:idea Java环境: jdk1.8.0_121 数据库:SQLServer 项目结构,里面包含了三 ...

  5. MyBatis的关联映射和动态SQL

    CREATE TABLE tb_card ( id INT PRIMARY KEY AUTO_INCREMENT, CODE ) ); '); CREATE TABLE tb_person ( id ...

  6. 【Hibernate框架】关联映射(一对一关联映射)

    一.整理思路: 之前,小编总结过Mybatis的关联映射,接下来,再来总结一下hibernate的相关的关联映射,直接上图: 这张图,就是小编整理总结整个Hibernate的关联映射的一个大致思路. ...

  7. Mybatis(四)关联映射

    一. Mybatis关联映射 1 讲数据库中关联关系,主键表与外键表 一对多,多对一,主键表表示一 与外键表表示多 学生与学校的关系,工人与工厂,人员与部门的关系,.... 多        一    ...

  8. SSM框架开发web项目系列(三) MyBatis之resultMap及关联映射

    前言 在上篇MyBatis基础篇中我们独立使用MyBatis构建了一个简单的数据库访问程序,可以实现单表的基本增删改查等操作,通过该实例我们可以初步了解MyBatis操作数据库需要的一些组成部分(配置 ...

  9. MyBatis学习(七)MyBatis关联映射之多对多映射

    对于数据库中的多对多关系建议使用一个中间表来维护关系. 1.创建四张表,分别为用户表,商品表,订单表,中间表. DROP TABLE IF EXISTS `t_user`; CREATE TABLE ...

随机推荐

  1. PHP 中的新语法 new static 是个啥意思?

    简单通俗的来说, self就是写在哪个类里面, 实际调用的就是这个类.所谓的后期静态绑定, static代表使用的这个类, 就是你在父类里写的static, 然后通过子类直接/间接用到了这个stati ...

  2. 【bzoj2844】albus就是要第一个出场

    Time Limit: 6 Sec  Memory Limit: 128 MBSubmit: 2254  Solved: 934[Submit][Status][Discuss] Descriptio ...

  3. [JSOI2008]Blue Mary的战役地图——全网唯一一篇dp题解

    全网唯一一篇dp题解 网上貌似全部都是哈希+二分(反正我是大概baidu了翻了翻)(还有人暴力AC了的..) 哈希还是相对于dp还是比较麻烦的. 而且正确性还有可能被卡(当然这个题不会) 而且还容易写 ...

  4. Linux基础-配置网络、集群内主机名设定、ssh登入、bash命令、通配符(元字符)

    作业一:临时配置网络(ip,网关,dns)+永久配置 设置临时网络配置: 配置IP ifcongfig ens33 192.168.16.177/24 (ifconfig 网卡 ip地址    /24 ...

  5. 图:centrality

    [定义]Centrality:图中每个节点v的相对重要度c(v),重要度是什么可根据具体应用定义. [估计方法] Degree centrality Betweenness centrality Cl ...

  6. 目前最快速的多线程Kmeans算法,java实现

    目前最快速Kmeans算法,并由java实现!面对很大的K值表现依然很好. 代码地址: https://github.com/Jethu1/fastKmeans #1.这是一个由java实现的的,多线 ...

  7. 阿里云ECS/Ubuntu下***浅析

    公司项目中需要WebRTC作为即时通讯部分的核心技术,这部分的开发由我负责.实际上手前需要访问谷歌进行源码的下载以及编译,在这里记录下我各种折腾服务器***过程. 目前手上有两台阿里云ESC: 华南节 ...

  8. JAVA 日期处理工具类 DateUtils

    package com.genlot.common.utils; import java.sql.Timestamp;import java.text.ParseException;import ja ...

  9. hdu 1907 John (anti—Nim)

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)http://acm.h ...

  10. Python学习笔记(三十九)— 内置模块(8)XML基础

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432002075 ...