12、mybatis懒加载的设置

MyBatis的Lazy Loading可以实现延迟查询Bean里的嵌套成员类,控制lazy loading的<settings>属性有

lazyLoadingEnabled: lazy loading开关

aggressiveLazyLoading: 侵略性 lazy loading 开关

设置项 描述 允许值 默认值
lazyLoadingEnabled 全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 true | false 3.4.1后为false
aggressiveLazyLoading 当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 true | false 3.4.1后为true

延迟加载

  延迟加载对主对象都是直接加载,只有对关联对象是延迟加载。

  延迟加载可以减轻数据库的压力,

  延迟加载不可是一条SQL查询多表信息,这样构不成延迟加载,会形成直接加载。

延迟加载分为三种类型:

1.直接加载

执行完主对象之后,直接执行关联对象。

2.侵入式加载

在执行主对象详情的时候,执行关联对象。

3.深度延迟加载

执行完主对象或主对象详情不会执行关联对象,只有用到关联对象数据的时候才走深度延迟加载。

看一下几个例子

1.默认情况的延迟加载  (这是在MyBatis3.4.1版本之前的默认情况) :(aggressiveLazyLoading)侵入式延迟加载为true, 在3.4.1之后的版本(aggressiveLazyLoading)侵入式延迟加载默认值为false

  2.侵入式延迟加载

现在看一下访问主属性的侵入式延迟加载的状态如何

  3.深度延迟加载

深度延迟加载 大配置中的设置

只访问主对象的属性,深度延迟加载的状态为:

现在我们看一下访问关联对象的属性,深度延迟加载的状态为:

我现在用的mybatis3.5.3的默认值为:<settings>    <setting name="lazyLoadingEnabled" value="false"/>    <setting name="aggressiveLazyLoading" value="true"/>   <!--现在的状态为直接加载-->(3.4.1版本之后的直接加载设置)</settings>

所以改为深度延迟加载即
<settings>    <setting name="lazyLoadingEnabled" value="true"/>    <setting name="aggressiveLazyLoading" value="false"/>   <!--现在的状态为直接加载-->(3.4.1版本之后的直接加载设置)</settings>

建议修改懒加载时这两个设置项同时修改

原文地址:https://www.cnblogs.com/lyh233/p/12349662.html

时间: 2024-10-11 06:20:42

12、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; 分析: ①这里我们一次查询出所有用户信息,需要什么部门信息的时候直接从查询的结果中筛选.但是如果部门和用户表都比较大的时候,这种关联查询肯定比较耗时. ②我们的需求是有时候需要关联查询部门信息.这里不是一定需要部门信息的.即有时候不需要查询部门信息,我们也查

MyBatis 懒加载

懒加载的概念 MyBatis中的延迟加载,也称为懒加载,是指进行关联查询时,按需执行子查询. 当程序需要获取|使用关联对象时,mybatis再执行子查询,这样可以减轻数据库的压力. 懒加载的适用场景: 当前业务只使用主加载对象的其他属性,或者暂时只使用主加载对象的其他属性,长时间以后才使用主加载对象的关联对象属性. 懒加载只对关联查询起作用(一对一.一对多.多对多),且只对嵌套查询方式起作用,因为嵌套结果.扩展类的方式都是一次查询所需数据,不存在子查询,也就不存在延迟加载的情况. MyBatis

关于 Mybatis 设置懒加载无效的问题

看了 mybatis 的教程,讲到关于mybatis 的懒加载的设置: 只需要在 mybatis 的配置文件中设置两个属性就可以了: <settings> <!-- 打开延迟加载的开关 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 将积极加载改为消息加载即按需加载 --> <setting name="aggressiveLazy

Mybatis处理表关联(懒加载)

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

八、懒加载

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

Hibernate一对一,一对多懒加载的要求

懒加载要求Domain对象不能是final的,因为Hibernate需要生成一个继承自该Domain对象的类来实现懒加载.懒加载主要有三种: 1. 对象的懒加载 2. 关联集合的懒加载 3. 对象属性的懒加载 对象的懒加载 对象的懒加载就是在映射文件的class标签中设置lazy属性为true,这时,如果用session.load方法获取这个对象的话,Hibernate只返回一个代理对象,而不是真的去查询数据库,等到真正用到这个对象的时候,Hibernate才会去查询数据库. 关联集合的懒加载