前言
之前初步了解了mybatis,现在进一步了解mybatis关系映射
一、关联关系概述
实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系。针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关系。
在关系型数据库中,多表之间存在着三种关联关系,分别为一对一、一对多和多对多,如下图所示:
在Java中,通过对象也可以进行关联关系描述,如图下图所示:
二、三种关系
1.一对一
在现实生活中,一对一关联关系是十分常见的。例如,一个人只能有一个身份证,同时一个身份证也只会对应一个人。
在<association>
元素中,通常可以配置以下属性:
MyBatis加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。
虽然使用嵌套查询的方式比较简单,但是嵌套查询的方式要执行多条SQL语句,这对于大型数据集合和列表展示不是很好,因为这样可能会导致成百上千条关联的SQL语句被执行,从而极大的消耗数据库性能并且会降低查询效率。
使用MyBatis的延迟加载在一定程度上可以降低运行消耗并提高查询效率。MyBatis默认没有开启延迟加载,需要在核心配置文件中的<settings>
元素内进行配置,具体配置方式如下:
<settings>
<setting name="lazyLoadingEnabled" value="true" />
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
2.一对多
开发人员接触更多的关联关系是一对多(或多对一)。例如,一个用户可以有多个订单,同时多个订单归一个用户所有。
<collection>
子元素的属性大部分与<association>
元素相同,但其还包含一个特殊属性–ofType 。
<collection >
元素的使用也非常简单,同样可以参考如下两种示例进行配置,具体代码如下:
3.多对多
在实际项目开发中,多对多的关联关系也是非常常见的。以订单和商品为例,一个订单可以包含多种商品,而一种商品又可以属于多个订单。
在数据库中,多对多的关联关系通常使用一个中间表来维护,中间表中的订单id作为外键参照订单表的id,商品id作为外键参照商品表的id
在MyBatis中,多对多的关联关系查询,同样可以使用前面介绍的元素进行处理(其用法和一对多关联关系查询语句用法基本相同)。
总结
本章首先对开发中涉及到的数据表之间以及对象之间的关联关系作了简要介绍,并由此引出了MyBatis框架中对关联关系的处理;然后通过案例对MyBatis框架处理实体对象之间的三种关联关系进行了详细讲解。
通过本章的学习,读者可以了解数据表以及对象中所涉及到的三种关联关系,并能够使用MyBatis框架对三种关联关系的查询进行处理。MyBatis中的关联查询操作在实际开发中非常普遍,熟练掌握这三种关联查询方式有助于提高项目的开发效率