2.4 Mybatis框架 --多表查询在Mybatis中关联POJO类(一对一、一对多、多对多)

1.背景:

在涉及到数据库操作时,常常遇到多表联合查询问题,在java中就涉及到了POJO类(数据库表的映射类)的关联,在Mybatis中也提供了关联映射,解决多表联合查询的问题

根据数据库中表与表的关系,主要分为一对一,一对多、多对多 3种情况:

2.一对一:

利用<resultMap> 元素 的 <association>子元素来处理一对一的关联关系

Mybatis针对一对一的关联关系,提供了两种实现方式:
嵌套查询
(是在查询SQL中嵌入一个子查询,在查询过程中,会执行多条SQL语句,但单个SQL语句的编写较为简单)

其中,<resultMap>元素的
type属性:指定java中的类作为查询结果的返回类型;
id属性:是resultMap的唯一标识,供Select定义的SQL关联使用;
id子元素:在于标识主键,property、column分别表示POJO类的属性、数据库表的字段;
&emsp**;result子元素**:property、column分别表示POJO类的属性、数据库表的字段;
association子元素
property属性:指定POJO类的属性名;
column属性:指定数据库表的字段名称;
&emsp**;javaType属性**:指定映射到POJO类的属性的数据类型(这里一般是一对一关联的另一个POJO类名(如本例的Idcard))
select属性:指定引入的嵌套查询的子查询语句;
fetchType属性:指定在联合查询时,是否启用延迟加载,属性值分为“lazy”、“eager”两个,默认为lazy,即启用延迟加载(一定程度上,可以提高查询效率)

demo:
一个人的信息(年龄、性别,身份证号码),其中,身份证号码存在数据库表的另一张表中,两张表通过id关联

在这里插入图片描述

嵌套结果(是执行一个嵌套多表的查询SQL,查询中只会执行一条SQL语句,但是SQL的编写较为复杂)

该种方法,相对于嵌套查询,主要难点在于编写SQL语句,用到的属性及元素在嵌套查询中,均已说明;
不同的是
嵌套查询在association子元素中的select属性指定的子查询;
嵌套结果中,则直接将身份证号码也就是Person类的card属性,通过association元素的javaType属性直接与Idcard这个POJO类关联
demo
在这里插入图片描述

如果还是混乱,看大图:

在这里插入图片描述

3.一对多

Mybatis利用<resultMap>元素的<collection>子元素来处理一对多的关联
<collection>的大部分属性 与 <association> 相同,不同的是,<collection>元素还有一个属性 ofType。
<collection>的ofType属性 与 javaType 对应,用于指定POJO类中 集合类属性所包含的元素类型(即 List 中的 T)

demo(也可以分为嵌套查询和嵌套结果两类的,此处是嵌套结果的):
在这里插入图片描述

4.多对多

这个就和一对多 基本 一直了,区别只是在于 嵌套查询的子查询的SQL写法了
在这里插入图片描述

5.写在最后:

Mybatis的延迟加载在一定程度上,降低运行消耗并提高查询效率,在Mybatis的核心配置一般没有开启延迟加载,可以在核心配置文件mybatis-config.xml文件 <configuration> 根节点下,添加 <settings> 子元素(忘了就看看 2.2):

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

配置开启延迟加载,在配置文件中配置延迟加载后,就无需配置映射文件的 resultMap > association > fetchType属性了


版权声明:本文为weixin_43835284原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。