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属性了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值