查询延迟加载/查询

存在联表查询中;联表查询必须是多表单独查询

概念:将查询的时机推迟

单表查询:不存在延迟查询

联表查询:

      多表一次查询:不存在延迟查询

      多表单独查询:会执行多条sql语句,才会存在延迟查询。

目的:只立马执行需要的数据的sql语句

比如:用户和地址数据

      两条sql语句

      select * from tuser where id = ?       需要立马执行的

      select * from taddress where aid = ?   可以延迟执行,在获取用户的地址的时候才执行

好处:减小数据库的压力

Mybatis的延迟加载方式:

直接加载

执行完主对象的sql语句之后,立马执行关联对象的sql语句

配置

配置Mybatis的主配置文件:

      主配置文件中在proerties标签和typeAliaes标签之间可以配置settings的标签,用来配置全局配置的。

开启延迟加载的属性:

lazyLoadingEnabled:全局性设置懒加载。如果设为‘false’,则所有相关联的sql都会立即执行。默认为false

aggressiveLazyLoading:当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。默认为true

侵入式延迟加载

执行完主对象的sql语句之后,不会立即执行关联对象的sql语句,当访问主对象中的数据时才会执行关联对象的sql语句。

User{id,name,money,birthday,Address address}

User u = userDao.listById(11);

u.getId()的时候立马执行关联sql语句的查询,查询address的数据

配置

运行结果

当没有取获取主对象的属性的值的时候,关联对象的sql语句不执行

当调用对象的属性的值的时候,才执行关联对象的sql语句

深度延迟加载

User{id,name,money,birthday,Address address}

User u = userDao.listById(11);

u.getId()

当执行u.getId()的时候还是不会执行关联对象的sql语句

当执行u.getAddress() ()当获取关联对象里面数据的时候才执行关联对象的sql语句

配置

运行结果

总结

直接加载:

      lazyLoadingEnabled:false

aggressiveLazyLoading:false

侵入式延迟加载:

      lazyLoadingEnabled:true

aggressiveLazyLoading:true

深度延迟加载

      lazyLoadingEnabled:true

aggressiveLazyLoading:false

 

猜你喜欢

转载自www.cnblogs.com/Tunan-Ki/p/11780104.html