首页 > 代码库 > MyBatis应用开发(16)延迟加载之概念

MyBatis应用开发(16)延迟加载之概念

1.1.1. 延迟加载的概念

延迟加载是指在存在关联关系时,在加载主表数据时,仅仅加载主表数据到映射的Java Bean对象中,而不会立即将关联的子表数据加载到存在关联关系的从属Java Bean中。在访问到关联的Java Bean的有关方法时,才会加载子表到关联的从属Java Bean中。

 

使用嵌套查询时,MyBatis支持延迟加载功能。

 

MyBatis提供了2种方式控制延迟加载与否。

方式一:在SqlMapConfig.xml文件中使用3setting结点控制整个程序中的associationcollection涉及的关联关系是否使用延迟加载。

 

<!-- 延迟加载:true,  立即加载:false,默认false -->

<setting  name="lazyLoadingEnabled" value="http://www.mamicode.com/true" />

 

<!-- 侵略性延迟加载 : 默认false(3.4.2以及更新版本MyBatis)

   true:访问主表数据对应的Java Bean的代理对象任何方法将导致所有的延迟加载属性关联对象被立即加载。此时导致lazyLoadingEnabled失效。

   false:关联对象不会被立即加载。

-->

<setting  name="aggressiveLazyLoading" value="http://www.mamicode.com/false" />

 

<!-- 在使用延迟加载之后,访问主表数据对应的Java Bean的代理对象的哪些方法将导致加载被触发。此处触发加载时将加载该Java Bean的所有延迟加载属性关联对象对应的数据。

    默认值:equals,clone,hashCode,toString。  

 -->

<setting name="lazyLoadTriggerMethods" value="http://www.mamicode.com/equals,clone,hashCode,toString" />

 

 

方式二:在associationcollection使用fetchType属性控制单个语句的延迟加载。

 fetchType:加载方式。

        lazy:延迟加载。

        eager:立即加载。

 

fetchType在使用后会覆盖setting中的全局配置,即使用了fetchType的语句,其延迟加载与否是由fetchType决定。

 

MyBatis应用开发(16)延迟加载之概念