什么是延迟加载
延迟加载又叫懒加载,也叫按需加载。也就是说先加载主信息,在需要的时候,再去加载从信息。
在mybatis中,resultMap标签 的association标签和collection标签具有延迟加载的功能。
需求:
如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。
延迟加载:先从单表查询,需要时再从关联表去查询,大大的提高数据库性能,因为查询单表要比关联查询多表的速度要快。
使用association实现延迟加载
1)需求:
查询订单信息,关联查询用户信息
1.创建一个statement来查询订单信息
SELECT * FROM orders;
在查询订单的statement中使用association去延迟加载(执行)虾米那statement(关联用户信息)
2.关联查询用户信息
通过上面查询到的订单信息中的user_id去关联查询用户信息
2)mapper.xml
我们需要定义两个mapper的方法对应的statement。
1.只查询订单信息
2.查询用户信息
上面先去执行findOrdersUserLazyLoading,当需要时再通过findUserById去查询用户,通过resultMap的定义将延迟加载执行配置起来。
3)Mapper接口
//延迟加载
public List<OrdersExt> findOrderAndUserLazyLoading();
4)设置延迟加载
Mybatis默认是没有开启延迟加载的,需要在SqlMapConfig.xml中配置
<settings>
<!--开启延迟加载,默认值为true-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--将积极加载改为消极加载,即按需加载,默认是true-->
<setting name= "aggressiveLazyLoading" value = "false"/>
</setting>
5)测试
public void testFindOrderUserLazyLoading() throws Exception{
SqlSession sqlSession = sqlSessionFactory.openSession();//创建代理对象
OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
//查询订单信息(单表)
List<Orsers> list = ordersMapperCustom.findOrdersUserLazyLoading();
//遍历上面的订单列表
for(Orders orders : list){
//执行getUser()去查询用户信息,这里实现按需加载
User user = orders.getUser();
System.out.println(user);
}
}