在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性.

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映射语句来返回预期的复杂类型。

    <pre class="has" name="code"><code class="hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  嵌套查询是在查询SQL中嵌入一个子查询SQL;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  嵌套查询会执行多条SQL语句;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  嵌套查询SQL语句编写较为简单;</div></div></li></ol></code><div class="hljs-button signin" data-title="登录后复制" onclick="hljs.signin(event)"></div></pre>
    </li>
    <li>
    <p>嵌套结果:嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。</p><pre class="has" name="code"><code class="hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  嵌套结果是一个嵌套的多表查询SQL;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  嵌套结果只会执行一条复杂的SQL语句;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">  嵌套结果SQL语句编写比较复杂;</div></div></li></ol></code><div class="hljs-button signin" data-title="登录后复制" onclick="hljs.signin(event)"></div></pre>
    </li>
    

虽然使用嵌套查询的方式比较简单,但是嵌套查询的方式要执行多条SQL语句,这对于大型数据集合和列表展示不是很好,
因为这样可能会导致成百上千条关联的SQL语句被执行,从而极大的消耗数据库性能并且会降低查询效率。

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

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

1.3 一对多

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

<resultMap>元素中,包含了一个<collection>子元素,MyBatis就是通过该元素来处理一对多关联关系的。
<collection>子元素的属性大部分与<association>元素相同,但其还包含一个特殊属性--ofType 。

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

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

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

1.3 多对多

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

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

上述这种是多对多映射,横跨了三张表,两张一对多关系型表.

  1. <id column="id" property="id"></id>
  2. <!--一对一-->
  3. <association property="user" javaType="User" autoMapping="true">
  4. <id column="uid" property="id"></id>
  5. </association>
  6. <!--一对多-->
  7. <collection property="orderdetails" javaType="List" ofType="Orderdetail" autoMapping="true">
  8. <id column="detail_id" property="id"></id>
  9. <!--订单详情和商品的一对一的关系-->
  10. <association property="item" javaType="Item" autoMapping="true">
  11. <id column="iid" property="id"></id>
  12. </association>
  13. </collection>
  14. </resultMap>
  15. <!--多对多查询-->
  16. <select id="queryOrderAndUserAndOrderdetailAndItemByOrderNumber" resultMap="orderAndUserAndOrderdetailsAndItemResultMap">
  17. SELECT
  18. *,u.id as uid,od.id as detail_id,i.id as iid
  19. FROM
  20. tb_order o
  21. INNER JOIN tb_user u ON o.user_id = u.id
  22. INNER JOIN tb_orderdetail od on od.order_id = o.id
  23. INNER JOIN tb_item i on i.id = od.item_id
  24. WHERE
  25. o.order_number = #{orderNumber}
  26. </select>

Mybatis中的关系映射(一对一,一对多,多对多)相关推荐

  1. mysql中建立一对多映射_Mybatis中的高级映射一对一、一对多、多对多

    学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...

  2. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  3. SQLAlchemy_定义(一对一/一对多/多对多)关系

    SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...

  4. Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作

    Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: ​ ​ ​  ​ ​ 由于如果只使用一张表存储所有的数据,就会操作数 ...

  5. mysql在xml中jdbctype,MyBatis中的JdbcType映射使用详解

    Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate.Mybatis等这些持久化支持. 项目中用到了MyBatis,和JDBC最显著的区别,就是SQL语句配置化,通过xml文 ...

  6. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

  7. Mybatis学习第四天——一对一一对多

    两表关系: 1.Mybatis中一对一关系 1 <!-- 两表联查,通过相同属性user_id 2 left join 表示以左边的表为主表 3 --> 4 <select id=& ...

  8. 8、mybatis中的sql映射文件详解(3)

    对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来.首先大家需要了解mybatis是什么.用mybatis来做什么.为什么要用mybatis.有什么优缺点:当知道了为什么的时候 ...

  9. 7、mybatis中的sql映射文件详解(2)

    对于初学者,如何进行mybatis的学习呢?我总结了几点,会慢慢的更新出来.首先大家需要了解mybatis是什么.用mybatis来做什么.为什么要用mybatis.有什么优缺点:当知道了为什么的时候 ...

最新文章

  1. as用百度地图不联网就gg
  2. 关于FillSchema与Fill
  3. 故乡 | 登高望远,夜幕降临
  4. UOJ #188. 【UR #13】Sanrd
  5. Jetty 的工作原理以及与 Tomcat 的比较
  6. 用单片机制作简单的频率计
  7. 如何定义 Java 中的方法
  8. 引用数据类型Scanner,Random
  9. 景深决定照相机什么特性_什么是景深?
  10. 052试题 97 - SQL*Loader Direct Path and Conventional Path
  11. Jmeter的Html报告汉化及解析
  12. s鼠标在计算机哪部分里,罗技g602和g700s哪个好_罗技g602鼠标怎么样【详细介绍】-太平洋IT百科...
  13. html在线印章,纯前端Html+JavaScript+canvas生成公章
  14. 伴随我们长大的经典—写给从80后的一批人
  15. php的框架修改建议,thinkphp 框架适配修改
  16. oracle join 优化询,oracle中优化left join的工作心得
  17. SQLite轻量级数据库jar包链接
  18. 【大全】深度强化学习入门到精通
  19. 「网络流 24 题」5.圆桌聚餐
  20. 意志力是一种有限的资源吗?

热门文章

  1. 用什么擦地最干净脑筋急转弯_27个有意思的脑筋急转弯(含答案)
  2. 【oiClass 2085】马(排序,DP)
  3. 基于FPGA的啸叫检测与抑制系统设计与实现verilog
  4. 判断文件或目录是否存在的几种方式
  5. 判断文件或文件夹是否存在的方法
  6. cannot find package “github.com/PuerkitoBio/goquery“ in any of
  7. 华为手撕代码c语言题目,想去面试?这10道最高频的手撕代码题都会了吗?
  8. 【JAVA】计算算式
  9. 5个方法助设计师保持创造力
  10. 一幅长文细学华为MRS大数据开发(二)——HDFS分布式文件系统和ZooKeeper