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

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

mysql与mybatis映射关系_java


一对一 :在任意一方引入对方主键作为外键;在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a;

一对多:在“”的一方,添加“一”的一方的主键作为外键;一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a;

多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键;在A类中定义B类类型的集合,在B类中定义A类类型的集合。

一对一

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

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

mysql与mybatis映射关系_mybatis_02


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

mysql与mybatis映射关系_mysql_03


mysql与mybatis映射关系_java_04


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

使用MyBatis的延迟加载在一定程度上可以降低运行消耗并提高查询效率。MyBatis默认没有开启延迟加载,需要在核心配置文件中的<settings>元素内进行配置,具体配置方式如下:

<settings>
            <setting name="lazyLoadingEnabled" value="true" />  
            <setting name="aggressiveLazyLoading" value="false"/>  
    </settings>

在映射文件中,<association>元素和<collection>元素中都已默认配置了延迟加载属性,即默认属性fetchType=“lazy”(属性fetchType="eager"表示立即加载),所以在配置文件中开启延迟加载后,无需在映射文件中再做配置。

一对多

<resultMap>元素中,包含了一个<collection>子元素,MyBatis就是通过该元素来处理一对多关联关系的。<collection>子元素的属性大部分与<association>元素相同,但其还包含一个特殊属性–ofType 。
ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。

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

mysql与mybatis映射关系_mybatis_05

多对多

多对多的关联关系查询,同样可以使用<collection >元素进行处理(其用法和一对多关联关系查询语句用法基本相同)。
在数据库中,多对多的关联关系通常使用一个中间表来维护。