额外SQL查询的问题:
当使用额外SQL语句查询只查询部门的编号和名字时时,会出现以下情况
每查询一个部门都会额外发送一条SQL语句.
但是我们只想查询部门的编号和名字,不想查询部门员工,每查询一个部门都发送一条SQL语句.这极大的降低了程序的性能.
所以延迟加载出现了,当我们只想查询部门的编号和名字的时候,通过延迟加载的设置,可以使程序不再去查询部门中员工的信息.
延迟加载的设置:
Mybatis配置文件中的顺序:
<!ELEMENT configuration (properties?, settings?, typeAliases?, typeHandlers?, objectFactory?, objectWrapperFactory?, reflectorFactory?, plugins?, environments?, databaseIdProvider?, mappers?)>
配置延迟加载:
<!--配置延迟加载-->
<settings>
<!--打开延迟加载的全局开关-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--不要积极的去查询关联的对象-->
<setting name="aggressiveLazyLoading" value="false"/>
<!--覆盖延迟加载的触发方法-->
<setting name="lazyLoadTriggerMethods" value=""/>
</settings>
通过配置,只查询部门编号和名字时,就没有发送多余的查询语句
延迟加载配置详解:
lazyLoadingEnabled:全局性设置懒加载。如果设为‘false’,则所有相关联的sql都会立即执行。默认为false
aggressiveLazyLoading:设置为false时,每个属性都按需加载。设置为true时,所有懒加载对象都立即加载.默认为true
lazyLoadTriggerMethods:配置的方法全部都会立刻加载
设置参数 | 描述 | 有效值 | 默认值 |
---|---|---|---|
lazyLoadingEnabled | 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态。 | true、false | false |
aggressiveLazyLoading | 当开启时,任何方法的调用都会加载该对象的所有属性。否则,每个属性会按需加载(参考lazyLoadTriggerMethods). | true、false | false (true in ≤3.4.1) |
lazyLoadTriggerMethods | 指定哪个对象的方法触发一次延迟加载。 | 用逗号分隔的方法列表。 | equals,clone,hashCode,toString |