一对多查询之额外SQL语句中的延迟加载详解

额外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
发布了100 篇原创文章 · 获赞 7 · 访问量 7566

猜你喜欢

转载自blog.csdn.net/qq_40245464/article/details/103746670