Mybatis中的延迟加载,也叫做懒加载,是指在关联查询时,按照设置的延迟规则推迟对关联对象的select查询,延迟加载可以有效减少数据库的压力。

嵌套结果与嵌套查询

嵌套结果

在进行一对多的查询时一种类型的sql配置文件如下:

<resultMap id="userListMap" type="user"><!--id标签,映射查询结果集的唯一列column: 查询的sql结果中的列名property:映射结果的属性名--><id column="id_" property="id"/><!--result标签:映射结果集的普通列--><result column="username_" property="username"/><result column="birthday_" property="birthday"/><collection property="lstOrders" ofType="Orders"><id column="id" property="id"/><result column="uid" property="uid"/><result column="order_name" property="orderName"/></collection>
</resultMap>

如上面的案例所示,在resultMap标签里面有collection标签,并且collection标签里面还有映射的内容,这种形式叫做嵌套结果

嵌套查询

除了嵌套结果之外对应的还有嵌套查询,而嵌套查询与嵌套结果很类似,也是在一对多的查询时候用到,即resultMap标签里面也有collection标签,但是collection标签中没有结果集的一一映射,这种方式用在延迟加载中。

延迟加载的分类

直接加载

执行完对主加载对象的select语句,马上执行对关联对象的select查询。

在mybatis的主配置文件中配置

<!--配置直接延迟加载,默认是false,开启是true-->
<setting name="lazyLoadingEnabled" value="false"/>
  • 默认是false,也就是说如果使用默认值(也就是false),所有关联的sql都会查询出来。

一对一的直接加载

比如从订单的角度来看,订单和用户是一对一的关系,一对一可以通过association标签来体现,下面是一对一的直接加载案例。

OrdersMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN ""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace作用是为了分类管理映射文件中的MapperdStatement对象-->
<mapper namespace="top.mapper.OrdersMapper"><resultMap id="ordersMap" type="Orders"><id column="id" property="id"></id><result column="uid" property="uid" /><result column="order_name" property="orderName"/><association property="user" javaType="user" select="top.mapper.UserMapper.findUserById"column="uid"></association></resultMap><select id="findOrdersById" resultMap="ordersMap" parameterType="int" resultType="Orders" fetchType="lazy">select * from orders where id = #{id}</select>
</mapper>
  • association标签中的就是嵌套查询,因为该标签里面没有映射关系
  • association标签中的property属性表示的是order这个po中的user对象属性
  • association中的javaType属性表示的是返回值类型(这里使用user而不是全限定名是因为取了别名)
  • select标签是关联用户的查询语句,这里是加载的另外一个mapper文件(UserMapper.xml文件)
  • column属性表示是将哪一个参数值代入查询user的那个sql中,因为查询用户的sql中也是需要一个int类型作为参数,而column这个属性就是指定将orders中的uid这个属性值作为用户的查询条件。
  • fetchType属性需要设置为lazy,也就是延迟加载。

用户的查询语句UserMapper.xml中

<select id="findUserById" parameterType="int" resultType="user">select * from user where id = #{id}
</select>

在执行ordersMapper.findOrdersById(int i);这个方法的时候不不仅仅会将orders表内容查询出来,还会将user表的内容也会查询出来,这种形式就是直接加载。

侵入式加载

执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情时,就会马上执行关联对象的select查询。即对关联对象的查询执行,侵入到了主加载对象的详情访问中。也可以这样理解:将关联对象的详情侵入到了主加载对象的详情中,即将关联对象的详情作为主加载对象的详情的一部分出现了。

在mybais主配置文件中配置

<!--配置直接延迟加载,默认是false-->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关,默认是true -->
<setting name="aggressiveLazyLoading" value="true"/>
  • 延迟加载开关需要开启,也就是lazyLoadingEnabled需要设置为true
  • 侵入式延迟加载开关需要开启,也就是aggressiveLazyLoading需要设置为true

其余的sql配置文件相同,再来看一下测试代码:

@Testpublic void findOrdersById () {SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);Orders orders = ordersMapper.findOrdersById(1);//System.out.println(orders);sqlSession.close();}

如果将System.out.println(orders);这一句代码注释掉,那么只会查询orders这个表,因为没有使用到orders实体,但是如果将这句注释代码打开那么一开始就会既查询orders表也会查询user表,这就是侵入式的特点,因为使用到了orders表。

深度加载

执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询

mybatis中的主配置文件

<!--配置直接延迟加载,默认是false-->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 侵入式延迟加载开关,默认是true -->
<setting name="aggressiveLazyLoading" value="false"/>
  • 将延迟加载开关设置为true(默认是false,也就是直接加载)
  • 将侵入式延迟加载设置为false(默认为true,也就是侵入式延迟加载),就会变成深度延迟加载。

转载于:https://my.oschina.net/guowei11/blog/3086465

嵌套结果、嵌套查询与延迟加载相关推荐

  1. mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...

    mysql数据库优化课程---12.mysql嵌套和链接查询(查询user表中存在的所有班级的信息?) 一.总结 一句话总结: in:distinct:select * from class wher ...

  2. mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...

    mysql数据库优化课程---12.mysql嵌套和链接查询(查询user表中存在的所有班级的信息?) 一.总结 一句话总结: in:distinct:select * from class wher ...

  3. ef关联多实体查询_Mybatis基本知识十二:关联关系查询之延迟加载:侵入式延迟加载...

    上一篇文章:<Mybatis基本知识十一:关联关系查询之延迟加载策略:直接加载> 若文中有纰漏,请多多指正!!! 1.前言 延续上一章节,本章节主要讲解和演示在关联关系查询中侵入式延迟加载 ...

  4. association 实现MyBatis分步查询与延迟加载

    一.分步查询 1.1什么时候可以用到分步查询 有的时候需要我们对数据库进行关联查询,比如Employee 持有另一个Department对象的一个引用,我们希望在查询Employee 的时候把Depa ...

  5. qt布局嵌套_QDockWidget嵌套布局详解-实现Visual Studio布局

    概述 许多工程软件,如Qt Creator,VS,matlab等,都是使用dock布局窗口,这样用户可以自定义界面,自由组合窗口. Qt的嵌套布局由QDockWidget完成,用Qt Creator拖 ...

  6. 【Java从0到架构师】MyBatis - 多表查询_延迟加载

    多表查询_延迟加载 多表关系 一对一 association 标签 + JOIN 实现一对一 一对多 \ 多对一 collection 标签 + LEFT JOIN 实现一对多 多对多 多对多的本质: ...

  7. Mybatis源码分析--关联表查询及延迟加载原理(二)

    在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...

  8. HashMap嵌套HashMap嵌套HashMap(三层嵌套)

    HashMap嵌套HashMap嵌套HashMap(三层嵌套) import java.util.ArrayList; import java.util.HashMap; import java.ut ...

  9. Python里面对于嵌套列表的查询

    在学习Python的过程中,学习到了用in和not in来判断指定列表中是否存在要查询的元素,但是这样的判断仅限制于普通列表,如下: 判断是否存在 in:判断指定数据在某个列表序列,如果在返回True ...

最新文章

  1. C#中,当鼠标移动到控件上,动态显示提示内容 - 用代码操作ToolTip
  2. 《JavaScript入门经典(第4版)》上第5章一个实例程序的修正,完善
  3. LiveVideoStackCon讲师热身分享 ( 十三 ) —— Intel QSV技术在FFmpeg中的实现与使用
  4. Raspberry Pi, UPNP(二), Scala
  5. Mysql存储过程和存储函数
  6. php怎么实现点卡充值,利用自动发卡程序的点卡充值传奇脚本
  7. 算法图解学习笔记02:递归和栈
  8. 【java】java 使用 Unsafe CAS 实现数据递增 打印重复问题
  9. python 虚线_Python 包安装和管理工具 pip 19.2 发布
  10. 中国塑溶胶密封剂行业市场供需与战略研究报告
  11. vim替换字符(包括行首行尾添加字符串)
  12. 【修正】Q93:PLY文件对应图形法向量反向问题——以bunny10K为例
  13. Win10之广告弹窗终结器:Process Explorer
  14. BulkRen文件批量改名工具的一点点使用心得
  15. Java实现的各种排序算法
  16. 【eoeAndroid特刊】第一期到第十八期
  17. python英语单词 扇贝英语安卓下载_扇贝单词英语版app下载-扇贝单词英语版v3.5.803 安卓版-腾牛安卓网...
  18. FAT32 R0.12b f_mkfs应用实例
  19. Mongo Java按日期查询
  20. 一不小心成了中国电力行业最大的无人机供应商,但曹飞的理想是推动整个产业变革

热门文章

  1. 织梦的网站地图怎么做html,织梦(dedecms)网站地图改变生成目录的方法
  2. 如何将单元格中的数据拆分多行
  3. ccs是轮_DEH一次调频与 CCS一次调频
  4. 关注APICloud微信,就送5元红包
  5. nyist 737
  6. 全力保障春运 西南最大“动车医院”启用动车“智能医生”
  7. FreeRTOS EFM32 中断配置
  8. 计算机科学中具有特殊含义或易误解混淆的术语辨析
  9. 不用费劲,这5款效率工具为你解决学习工作烦恼
  10. html阅读会不全吗,浏览器页面怎么显示不全?