Mybatis 延迟加载

什么是延迟加载

延迟加载又叫懒加载,也叫按需加载。也就是说先加载主信息,在需要的时候,再去加载从信息。

在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);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值