Mybatis延迟加载的实现方式

1、概念:

MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。

2、加载时机:

直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。侵入式延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。

注意:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。

3、侵入式延迟加载:

①、Mybatis-config.xml大配置文件,首先开启延迟加载,然后再配置侵入式加载

<!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--配置侵入式延迟加载   默认为false(深度加载)
      侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询
      深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询
    -->
    <setting name="aggressiveLazyLoading" value="true"/>

②、不调用主加载对象时只有一条SQL

③、调用主加载对象的信息时会产生两条SQL

4、深入式延迟加载:

①、Mybatis-config.xml大配置文件,首先开启延迟加载,然后再配置深度加载

<!--开启延迟加载-->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!--配置侵入式延迟加载   默认为false(深度加载)
      侵入式:默认只会执行主加载SQL,那么当访问主加载对象的详细信息时才会执行关联对象的SQL查询
      深度延迟:默认只执行主加载SQL,那么当调用到主加载对象中关联对象的信息时才会执行关联对象的SQL查询
    -->
    <setting name="aggressiveLazyLoading" value="false"/>

②、调用主加载对象时不会执行第二条加载SQL

③、调用关联对象详细信息时会执行第二次查询

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Mybatis中的延迟加载案例解析

    一.延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 延迟加载:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询多张表速度要快. 在mybatis核心配置文件中配置: lazyLoadingEnabled.aggressiveLazyLoading 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置

  • MyBatis 延迟加载、一级缓存、二级缓存(详解)

    使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能. 一.延迟加载 延迟加载已经是老生常谈的问题,什么最大化利用数据库性能之类之类的,也懒的列举了,总是我一提到延迟加载脑子里就会想起来了Hibernate get和load的区别.OK,废话少说,直接看代码. 先来修改配置项xml. 注意,编写mybatis.xm

  • mybatis中延迟加载Lazy策略的方法

    lazy策略原理:只有在使用查询sql返回的数据是才真正发出sql语句到数据库,否则不发出(主要用在多表的联合查询) 1.一对一延迟加载: 假设数据库中有person表和card表:其中person表中有字段pid,pname,page,psex,cid,card表中有字段cid,cnum; 假设要查询某个人的姓名和身份证号码: 原理:在查询姓名时,实际本没有查询出身份证号码的信息,只有当前台使用身份证号时才发出对card的查询,需要查询出身份证号码是采取查询的一种策略: 实现实例: 实现步骤:

  • Mybatis延迟加载和缓存深入讲解

    一.Mybatis中的延迟加载 1.延迟加载背景:Mybatis中Mapper配置文件中的resultMap可以实现高级映射(使用association.collection实现一对一及一对多(多对多)映射),同样的association.collection具备延迟加载功能.所谓延迟加载,就是先单表查询,需要时再从关联表去关联查询(同样也可能只是是单表查询),大大单表查询速度更快,所以可以间接的提高数据库性能 2.在mybatis核心配置文件中配置,其中lazyLoadingEnabled表示

  • mybatis教程之延迟加载详解

    延迟加载 1 使用延迟加载意义 在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快. 如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载. mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载. 2 配置mybatis支持延迟加载 在 SqlMapConfig.xml中配置全局参数: <!-- 全局配置参数 --> <settings> <

  • mybatis 延迟加载的深入理解

    什么是延迟加载 延迟加载又叫懒加载,也叫按需加载,也就是说先加载主信息,需要的时候,再去加载从信息.代码中有查询语句,当执行到查询语句时,并不是马上去DB中查询,而是根据设置的延迟策略将查询向后推迟. 什么时候会执行延迟加载 配置之后在对关联对象进行查询时使用延迟加载. 延迟加载策略 直接加载 遇到代码中查询语句,马上到DB中执行select语句进行查询.(这种只能用于多表单独查询) 侵入式延迟加载 将关联对象的详情(具体数据,如id.name)侵入到主加载对象,作为主加载对象的详情的一部分出现

  • Mybatis查询延迟加载详解及实例

    Mybatis查询延迟加载详解及实例 1.1     启用延迟加载 Mybatis的延迟加载是针对嵌套查询而言的,是指在进行查询的时候先只查询最外层的SQL,对于内层SQL将在需要使用的时候才查询出来.Mybatis的延迟加载默认是关闭的,即默认是一次就将所有的嵌套SQL一并查了将对象所有的信息都查询出来.开启延迟加载有两种方式. 第一种是在对应的<collection>或<association>标签上指定fetchType属性值为"lazy".如下示例中我们

  • Mybatis延迟加载的实现方式

    1.概念: MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询.例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力.MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的. 2.加载时机: 直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询.侵入式延迟: 执

  • MyBatis延迟加载与立即加载案例教程

    MyBatis入门-延迟加载与立即加载 加载策略 延迟加载 延迟加载(lazy load)是(也称为懒加载)Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作.延迟加载,可以简单理解为,只有在使用的时候,才会发出sql语句进行查询. 需要在主配置文件开启加载策略,子配置文件使用collection属性 立即加载 所谓立即加载就是查询时,所有的相关数据一次被读取出来,而不是分N次. 一对

  • MyBatis延迟加载策略深入探究

    目录 分步查询的优点 在主配置文件当中设置延迟加载 在studentDao.xml当中设置分步查询 测试结果 如何使用 延迟加载的好处 有两种写法来表示查询信息,分别是链表查询和分步查询的方法.那么既然我么能用一个SQL语句能够执行完,那为什么还要分开来写呢? 原因很简单:可以发现如果我们把他们连在一起那么他们就是一个多表查询语句,如果不放在一起执行,那那就是单独一个表的查询语句.但是这需要我们设置mybatis的延迟加载(懒加载) 分步查询的优点 **可以实现延迟加载,**但是必须在核心配置文

  • Spring整合MyBatis的三种方式

    1.整合之前的环境准备 导入相关的jar包 Junit测试 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> MyBatis <dependency> <groupId

  • 解析Mybatis延迟加载问题

    延迟加载问题 MyBatis针对关联表中的数据支持延迟加载.延迟加载其实就是将数据加载时机推迟,比如推迟嵌套查询的执行时机. 延迟加载可以实现先查询主表,按需实时做关联查询,返回关联表结果集,一定程度上提高了效率. <settings> <!-- 启用延迟加载特性,不配置默认关闭该特性--> <setting name="lazyLoadingEnabled" value="true" /> <!-- 按需加载: false

  • Springboot整合Mybatis传值的常用方式总结

    方式一:直接传 接口 public interface UserMapper { public List<User> getUserById(int id); } xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.or

  • java工程师进阶之MyBatis延迟加载的使用

    目录 什么是延迟加载? 如何使用延迟加载? 1.在 config.xml 中开启延迟加载 2.将多表关联查询拆分成多个单表查询 什么是延迟加载? 延迟加载也叫懒加载.惰性加载,使⽤延迟加载可以提⾼程序的运行效率,针对于数据持久层的操作, 在某些特定的情况下去访问特定的数据库,在其他情况下可以不访问某些表,从⼀定程度上减少了 Java 应⽤与数据库的交互次数. 查询学⽣和班级的时,学生和班级是两张不同的表,如果当前需求只需要获取学shengsheng的信息,那么查询学 ⽣单表即可,如果需要通过学⽣

  • 浅谈Mybatis获取参数值的方式

    目录 一. Mybatis获取参数值的各种情况 1.mapper接口方法的参数为单个字面量的类型 2.mapper接口方法的参数有多个 3.手动把参数放在map集合中 4.mapper接口方法的参数是实体类型的参数 5.通过@Param注解命名参数(比较常用) 二.总结 三.Param源码分析 Mybatis获取参数值的两种方式:${},#{} ${}本质:字符串拼接,注意:单引号要加上 #{}:本质:占位符赋值 一. Mybatis获取参数值的各种情况 1.mapper接口方法的参数为单个字面

随机推荐