MyBatis 懒加载

懒加载的概念

MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询。

当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力。

懒加载的适用场景:

当前业务只使用主加载对象的其他属性,或者暂时只使用主加载对象的其他属性,长时间以后才使用主加载对象的关联对象属性。

懒加载只对关联查询起作用(一对一、一对多、多对多),且只对嵌套查询方式起作用,因为嵌套结果、扩展类的方式都是一次查询所需数据,不存在子查询,也就不存在延迟加载的情况。

MyBatis的延迟加载只是延迟执行子查询,对于主加载对象的查询都是直接执行的。


子查询的执行时机(关联对象的加载时机)

一共有三种:

  • 直接加载:执行完主加载对象的查询,马上执行子查询。
  • 侵入式延迟: 先执行主加载对象的查询,后续使用主加载对象的属性时(调用getter方法)才执行子查询。只要使用主加载对象的属性,就执行子查询。
  • 深度延迟:先执行主加载对象的查询,后续使用主加载对象的关联对象属性时才执行子查询。使用的属性要是主加载对象的关联对象属性时,才执行子查询。

懒加载一共有2种方式,按照懒的程度,分为侵入式延迟、深度延迟。


配置方式

可在全局配置文件中进行配置,也可以在映射文件中进行配置。

(1)直接加载

默认就是直接加载,什么都不用配置,当然也可以显式配置:

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

(2)侵入式延迟

    <settings>
        <!-- 使用懒加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 使用侵入式延迟的懒加载 -->
        <setting name="aggressiveLazyLoading" value="true"/>
    </settings>

aggressive 咄咄逼人的、激进的、主动模式的、喜好侵入的,一有机会就加载,故名侵入式延迟。

缺省aggressiveLazyLoading时,默认为true——侵入式延迟。(据说旧版本的默认值是false——深度延迟,我未去验证。)

(3)深度延迟

 <settings>
        <!-- 使用懒加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 使用深度延迟的懒加载 -->
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

(4)也可以在映射文件的<association>或<collection>中单独配置某个关联对象的加载方式

<collection property="goodsList" select="com.chy.mapper.GoodsMapper.queryGoodsByGoodsId" column="no" ofType="goods" fetchType="lazy"/>

有2个可选的值:

  • eager  直接加载,默认值。eager 饥渴的。
  • lazy  深度延迟。

此种方式不能指定为侵入式延迟。

在全局配置文件中进行的配置是配置所有的,在映射文件中的配置是配置单个的。

如果在mybatis全局配置文件中显式配置了懒加载,又在映射文件中配置了懒加载,冲突时以全局配置文件中的配置为准。

原文地址:https://www.cnblogs.com/chy18883701161/p/12158924.html

时间: 2024-10-12 18:43:22

MyBatis 懒加载的相关文章

Mybatis懒加载机制

懒加载会按需要是否执行关联查询语句.如果用到了关联查询语句的信息,就需要执行关联查询,否则就只执行主查询 1.在mybatis的全局配置文件中加入两个属性: <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 开启懒加载机制 ,默认值为true--> <setting name="lazyLoadingEnabled&quo

mybatis懒加载特性详解,以及多对多映射详解

注意讲解都在代码中 准备数据库,测试数据,各位自己添加,因为是多对多,所以使用中间表: 用到的实体: 学生类: public class Student { private Integer sid; private String name; private Integer age; //一个学生有多个老师,一个老师有多个学生 private List<Teacher> teachers=new ArrayList<Teacher>(); setter.. getter.... to

Mybatis懒加载时,springMVC返回JSON异常 Could not write JSON: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl

在mybatis集成springmvc时,假如mybatis采用了懒加载,而springmvc中利用@ResponseBody注解返回实体类的JSON时会抛异常: Could not write JSON: No serializer found for class org.apache.ibatis.executor.loader.javassist.JavassistProxyFactory$EnhancedResultObjectProxyImpl and no properties di

Mybatis懒加载

一.需求:查询用户信息,有时候需要关联查出部门信息. 第一种方法:我们直接关联查询出所有用户和部门的信息 select * from tb_user u ,tb_department d where u.dep_id = d.dep_id; 分析: ①这里我们一次查询出所有用户信息,需要什么部门信息的时候直接从查询的结果中筛选.但是如果部门和用户表都比较大的时候,这种关联查询肯定比较耗时. ②我们的需求是有时候需要关联查询部门信息.这里不是一定需要部门信息的.即有时候不需要查询部门信息,我们也查

12、mybatis懒加载的设置

MyBatis的Lazy Loading可以实现延迟查询Bean里的嵌套成员类,控制lazy loading的<settings>属性有 lazyLoadingEnabled: lazy loading开关 aggressiveLazyLoading: 侵略性 lazy loading 开关 设置项 描述 允许值 默认值 lazyLoadingEnabled 全局性设置懒加载.如果设为‘false’,则所有相关联的都会被初始化加载. true | false 3.4.1后为false aggr

Mybatis处理表关联(懒加载)

1.关系型数据库? 数据库中的表对象之间是有关系的. 一对一,一对多,多对多. ORM映射.数据库表映射到实体对象. 实体与实体之间是有关系的. 一对多的关系. 比如商品分类表与商品表之间的关系,就是一对多的关系. 入库主表与入库子表之间的关系,也是一对多的关系. 出库主表与出库子表之间的关系,也是一对多的关系. ID编号  教师编号   课程编号   其余字段  (外键的都是多的关系) 1        001 2        001 很明显的就是在多的这个表里会出现1的这个表里的字段. 2

八、懒加载

1.需求:查询订单信息,有时候需要关联查出用户信息. 第一种方法:我们直接关联查询出所有订单和用户的信息 1 select * from orders o ,user u where o.user_id = u.id; 分析: ①.这里我们一次查询出所有的信息,需要什么信息的时候直接从查询的结果中筛选.但是如果订单和用户表都比较大的时候,这种关联查询肯定比较耗时. ②.我们的需求是有时候需要关联查询用户信息,这里不是一定需要用户信息的.即有时候不需要查询用户信息,我们也查了,程序进行了多余的耗时

mybatis(三)懒加载

懒加载的好处: 所谓懒加载(lazy)就是延时加载,延迟加载.什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载.至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,我们让数据在需要的时候才进行加载,这时我们就用到了懒加载.总结为: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强,层次感很强. 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强

MyBatis --- 映射关系【一对一、一对多、多对多】,懒加载机制

映射(多.一)对一的关联关系 1)若只想得到关联对象的id属性,不用关联数据表 2)若希望得到关联对象的其他属性,要关联其数据表 举例: 员工与部门的映射关系为:多对一 1.创建表 员工表 确定其外键是部门表的 id DROP TABLE IF EXISTS emp; CREATE TABLE emp( id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(255) DEFAULT NULL, gender CHAR(1