延迟加载

Mybatis延迟加载配置

主宰稳场 提交于 2019-12-02 11:42:00
定义: 延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作 Mybatis中的延迟加载 当代码执行到查询语句时候,并不是直接到DB中执行select查询语句,而是根据配置好的延迟策略,将查询延迟;来减轻DB服务器的压力; Mybatis中使用规则: 只能对关联对象进行查询时使用延迟加载策略;对于主对象直接加载即可; 只能使用多表单独查询,不能使用多表连接查询(多表连接查询直接可以查询到全部信息) Mybatis中延迟加载策略分为三种: 直接加载:执行到查询语句,马上到DB中去执行查询; 侵入式延迟加载:将关联对象详情侵入到主加载对象中,作为主加载对象的一部分,需要访问主加载对象时,关联对象也会被加载; 深入延迟加载:访问主加载对象,只会查询主表,不会查询关联表,用到关联对象时才到DB中查询; 配置 在Mybatis中可以在配置文件中进行配置: < configuration > <!--在此标签下面--> < settings > <!--延迟加载的总开关,默认是深度延迟加载--> < setting name = " lazyLoadingEnabled " value = " true " /> <!--侵入式延迟加载的开关,在总开关打开时才起作用--> <!--<setting name=

使用SMM框架开发企业级应用-----延迟加载及缓存

徘徊边缘 提交于 2019-12-01 15:00:19
延迟加载   什么是延迟加载:       MyBatis中的延迟加载,也称为懒加载,是指在进行表的关联查询时,按照设置延迟规则推迟对关联对象的select查询。例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载只是对关联对象的查询有迟延设置,对于主加载对象都是直接执行查询语句的。   加载时机:       直接加载: 执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。     侵入式延迟加载: 执行对主加载对象的查询时,不会执行对关联对象的查询。但 当要访问主加载对象的详情属性时,就会马上执行关联对象的select查询。     深度加载: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。 一、延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载。 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主对象属性的属性的时候,关联对象会被加载 03.深度延迟 访问主对象,并不加载关联对象

Entity Framework应用:Loading Entities

限于喜欢 提交于 2019-12-01 14:14:21
Entity Framework允许控制对象之间的关系,在使用EF的过程中,很多时候我们会进行查询的操作,当我们进行查询的时候,哪些数据会被加载到内存中呢?所有的数据都需要吗?在一些场合可能有意义,例如:当查询的实体仅仅拥有一个相关的子实体时可以加载所有的数据到内存中。但是,在多数情况下,你可能并不需要加载全部的数据, 而是只要加载一部分的数据即可。 默认情况下,EF仅仅加载查询中涉及到的实体,但是它支持两种特性来帮助你控制加载: 1、贪婪加载 2、延迟加载 下面以客户类型、客户和客户邮件三个实体之间的关系来讲解两种加载方式。 从上图可以看出三个实体类之间的关系: 客户类型和客户是一对多的关系:一个客户类型可以有多个客户。 客户和客户邮件是一对一的关系:一个客户只有一个邮箱地址。(假设只有一个邮箱地址) 一、延迟加载(Lazy Loading) 延迟加载:即在需要或者使用的时候才会加载数据。默认情况下,EF使用延迟加载的方式来加载数据。延迟加载是这样一种过程:直到LINQ查询的结果被枚举时,该查询涉及到的相关实体才会从数据库加载。如果加载的实体包含了其他实体的导航属性,那么直到用户访问该导航属性时,这些相关的实体才会被加载。 使用延迟加载必须满足两个条件: 1、实体类是由Public修饰符修饰的,不能是封闭类。 2、导航属性标记为Virtual。 1、定义实体类

延迟加载

青春壹個敷衍的年華 提交于 2019-12-01 12:48:14
十八. 延迟加载 概念: MyBatis中的延迟加载,也称为懒加载,是指在进行表的 关联查询 时,按照设置延迟规则推迟对关联对象的 select查询。例如在进行一对多查询的时候,只查询出一方,当程序中需要多方的数据时,mybatis再发出sql语句进行查询,这样子延迟加载就可以的减少数据库压力。MyBatis 的延迟加载 只是对关联对象的查询有迟延设置 , 对于主加载对象都是直接执行查询语句的。 加载时机: 直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。 侵入式延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的 select查询。 深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的 select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。 注意:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的 select 语句,不能是使用多表连接所进行的 select 查询。因为,多表连接查询,实质是对一张表的查询,对由多个表连接后形成的一张表的查询。会一次性将多张表的所有信息查询出来。 侵入式延迟加载配置方法: Mybatis-config.xml 大配置文件

Hibernate get load 区别 误区

大憨熊 提交于 2019-12-01 12:25:54
版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及 本声明 http://www.blogbus.com/fallenlord-logs/57543854.html 最近面试别人,正好出的笔试题中有道关于Hibernate延迟加载的问题,聊天过程中发现很多人对Hibernate的延迟加载有些理解误区,写些东东在这里,希望对大家有所帮助。 首先是第一个误区: 延迟加载只能作用于关联实体 看到这个是不是在想:非关联实体延迟加载有什么用? 为了解答上面这个问题,我们可以先考虑另一个问题: Hibernate Session的get和load方法有什么区别? 如果你的回答是: 当方法参数为数据库不存在的id时,get会返回null,load会抛出异常 ,那么恭喜你,进入了第二个误区 如果此时你还想补充一下: load会从缓存中取出数据而get不会 ,再次恭喜,进入第三个误区 如果你在上面三个误区中有一个踏入了,那么我敢打赌,你一定是被网上那些半吊子的工程师们写的博客给戕害了。。。。 此时是不是很愤怒?这些长久以来你牢记在心的Hibernate的特性原来都是浮云。。。。 呵呵,接下来我们一个个来走出这些误区。 Mop上无图无真相,我们这里无码无真相——不要误会,我是说代码 首先看看第二个误区:当方法参数为数据库不存在的id时,get会返回null,load会抛出异常 如果你现在想说

延迟与缓存

懵懂的女人 提交于 2019-12-01 11:30:49
MyBatis 的延迟加载策略和缓存 1 、延迟加载 ( lazyLoadingEnable ) ( 1)什么是延迟加载 MyBatis 中的延迟加载,也称为 懒加载 ,是指在进行 关联查询 的时候,按照设 置延迟加载规则 推迟对关联对象的 select 检索 。延迟加载可以有效的减少数据库 的压力。 注意 :MyBatis 的 延迟加载只是对关联对象的查询有延迟设置 ,对于 主加载对象 都是直接执行查询语句的 。 ( 2)关联对象的加载时机 1. 直接加载 2. 侵入式延迟加载 ( aggressiveLazyLoading ) 也可看做立即加载 3. 深度延迟加载 直接加载 : 即执行对象的 select 语句,完成对主加载马上执行对关联对象的 select 查询。 侵入式延迟加载 : 执行对 主加载对象 的查询时,不会执行对关联对象的查询。 但是当要访问主加载对象的 详情 时马上执行对关联对象的 select 查询。即对关联对象的执行查询,侵入到了主加载对象的访问详情中。也可理解为 : 将关联对象的详情侵入到主加载对象的详情中去,即将关联对象的详情作为主加载对象的一部分出现了 ! 深度延迟 : 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的 select 查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select

MyBatis延迟加载和缓存

蹲街弑〆低调 提交于 2019-12-01 11:25:50
一、延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载。 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主对象属性的属性的时候,关联对象会被加载 03.深度延迟 访问主对象,并不加载关联对象 访问主对象的属性的时候,关联对象也不会被加载 访问关联对象或关联对象的属性的时候,才会加载关联对象。 3.一对多延迟加载代码: 01.实体类代码: package cn.pb.bean; import java.util.Set; /** * 国家的实体类 */ public class Country { private Integer cId;//国家的编号 private String cName;//国家的名称 //关联省会的属性 private Set<Provincial> provincials; public Integer getcId() { return cId; } public void setcId(Integer cId) { this.cId = cId; } public String getcName() { return cName; } public void setcName(String cName) { this.cName = cName; }

延迟加载和缓存

人走茶凉 提交于 2019-12-01 10:06:23
延迟加载 问题分析:在一对多中,有一个用户,他有100个账户 查询用户的时候,要不要把关联的账户查出来? 查询用户时,账户信息应该什么时候用什么时候查 查询账户的时候,要不要把关联的用户查出来? 查询账户时,应该直接将用户信息也查出来 延迟加载:在真正使用数据时才发起查询,不用的时候不查询,又叫按需查询(懒加载) 立即加载:不管用不用,只要调用方法,直接发起查询 表关系:一对多 多对一 一对一 多对多(mybatis中没有 多对一 的概念) 一对多 多对多:通常采用延迟加载 多对一 一对一:通常采用立即加载 延迟加载的配置: 主配置文件 <!-- 配置延迟加载策略 --> <setting> <!-- 打开延迟加载的开关 --> <setting name="lazyLoadingEnabled" value="true" /> <!-- 将积极加载改为消息加载即按需加载 --> <setting name="aggressiveLazyLoading" value="false" /> </setting> JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型,而ofType指定的是映射到list集合属性中pojo的类型。 mapper的一对一mapper中的配置 <!-- resultMap中的配置 property

延迟加载和缓存

半腔热情 提交于 2019-12-01 09:46:42
一、延迟加载   1、 直接加载:执行完对主加载对象的 select 语句,马上执行对关联对象的 select 查询。   2、 侵入式延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。但当要访问主加载对象的详情属性时,就会马上执行关联对象的 select查询。     侵入式延迟的配置:       (1)配置mybatis-config.xml文件         在mybatis-config.xml文件中插入setting节点,并设置name属性和value属性值,配置lazyLoadingEnabled                (2)小配置文件中select语句必须为两条                (3)Test测试类                (4)执行结果如下(当不掉用对象中的字段或属性时只执行一条SQL)                  当调用其属性时执行的结果如下              3、 深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的 select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的 select 查询。     深度延迟的配置:       (1)配置mybatis-config.xml文件,在mybatis-config

MyBatis延迟加载和缓存

随声附和 提交于 2019-12-01 08:19:22
1、延迟加载(lazyLoadingEnable) (1)什么是延迟加载 MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询的时候,按照设 置延迟加载规则推迟对关联对象的select检索。延迟加载可以有效的减少数据库 的压力。 注意:MyBatis的延迟加载只是对关联对象的查询有延迟设置,对于主加载对象 都是直接执行查询语句的。 加载时机: 直接加载 :即执行对象的select语句,完成对主加载马上执行对关联对象的select查询。 侵入式延迟加载 :执行对主加载对象的查询时,不会执行对关联对象的查询。但是当要访问主加载对象的详情时马上执行对关联对象的select查询。即对关联对象的执行查询, 侵入到了主加载对象的访问详情中。也可理解为:将关联对象的详情侵入到主加载对象的详情中去,即将关联对象的详情作为主加载对象的一部分出现了! 深度延迟: 执行对主加载对象的查询时,不会执行对关联对象的查询。访问主加载对象的详情时也不会执行关联对象的select查询。只有当真正访问关联对象的详情时,才会执行对关联对象的select查询。 注意的问题:延迟加载的应用要求:关联对象的查询与主加载对象的查询必须是分别进行的select语句,不能是使用多表连接所进行的select查询。因为,多表连接查询,实质是对一张表的查询, 对由多个表连接后形成的一张表的查询