延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。需要关联信息时再去按需加载关联信息。这样会大大提高数据库性能。
首先在resultMap标签中的association和collection标签具有延迟加载的功能
第二,在xxxConfig.xml中需要开启延迟加载:
<settings>
<!-- 开启延迟加载,默认值是true -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 设置积极懒加载,默认值是true -->
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
这样设置完成后,正常的话,在日志中可以看到延迟加载的效果了。但是我发现当时并没有延迟加载,日志中有多条sql查询语句。后来发现,我的测试代码中,习惯性的加了一句打印语句,这触发了一次延迟加载
@Test
public void findOrderAndUserLazyLoading() {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
List<OrdersExt> list = mapper.findOrderAndUserLazyLoading();
// System.out.println(list);
for (OrdersExt ordersExt : list) {
System.out.println(ordersExt.getUser());
}
sqlSession.close();
}
将代码中的打印语句去掉即可。
或者可以在配置文件中加入以下语句
<setting name="lazyLoadTriggerMethods" />
lazyLoadTriggerMethods:指定哪个对象的方法触发一次延迟加载。默认值:equals,clone,hashCode,toString