07-Mybatis延迟加载

07-Mybatis延迟加载

在mybatis中只有resultMap标签的association标签和collection标签具有延迟加载的功能。

延迟加载的意思是在进行关联查询时,利用延迟加载,先加载主信息,需要关联信息时,再去按需加载关联信息。这样就会大大的提高数据库的性能,查询单表要比查询夺标速度要快的多。

设置延迟加载(打开延迟加载):Mybatis默认时不开启延迟加载的,需要我们去配置打开延迟加载。需要再全局配置文件中SqlMapConfig.xml中设置lazyLoadingEnabled,aggressiveLazyLoading
在这里插入图片描述

开启延迟加载:

<!-- 设置延迟加载 -->
	<settings>
		<setting name="lazyLoadingEnabled" value="true"/>
		<setting name="aggressiveLazyLoading" value="false"/>
	</settings>

上面已经在全局配置文件中打开了延迟加载,下面我们就通过一个案例来测试是否已经可以使用延迟加载了:

需求分析:

查询订单信息及关联的用户信息。

编码实现:

编写Javabean:

public class OrdersExt extends Orders{
	private User user;
        //省略getter和setter方法
}

编写Mapper接口

public interface OrdersMapper {
	public List<OrdersExt> findOrdersAndUserLazyLoading();
}

编写OrdersMapper.xml配置文件:

为了使用懒加载,把刚才的需求分解成,首先查询订单信息,然后再按需根据id查询用户信息。

这样就需要配置两个select标签语句;在进行关联查询的时候,association标签找那个的select 是把按需查询用户信息的statement的id,column的作用就是把查询出来的orders信息集合的外键user_id作为findUserById的入参。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper    
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"    
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lc.mybatis.mapper.OrdersMapper">
	
	<!-- 需求:查询订单信息(主信息为订单,从信息为用户),并且对关联表进行懒加载 -->
	<!-- 声明resultMap -->
	<resultMap type="ordersExt" id="lazyloading">
		<!-- 订单信息 -->
		<id column="id" property="id"/>		
		<result column="user_id" property="user_id"/>
		<result column="number" property="number"/>
		<!-- 用户信息(一对一) -->
		<!-- select属性:指定关联查询statement(即查询用户statement的id),然后将查询的结果封装到property指定的属性中去 -->
		<!-- column属性:指定查询出来的列column属性的值,作为statement查询语句的入参 -->
		<association property="user" select="findUserById" column="user_id"></association>
	</resultMap>
	<select id="findOrdersAndUserLazyLoading" resultMap="lazyloading">
		SELECT * FROM ORDERS
	</select>
	<select id="findUserById" parameterType="user" resultType="user">
		SELECT * FROM USER WHERE id=#{id}
	</select>
	
	<!-- 在mybatis中,resultMap标签 的association标签和collection标签具有延迟加载的功能。resultType结果映射就没有延迟加载 -->
 
</mapper>

编写测试类:

通过断点方式来测试是否使用了懒加载。在测试语句中得到lists处打断点,通过查询lists中的元素中的user属性是否为空,当执行到获取user对象后,再看lists中元素的user属性是否为空。

public class OrdersMapperTest {
 
private SqlSessionFactory sqlSessionFactory ;
	
	@Before
	public void setUp() throws IOException {
		InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	}
	@Test
	public void testFindOrdersAndUserLazyLoading() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//获取UserMapper的代理类
		OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
		List<OrdersExt> lists = ordersMapper.findOrdersAndUserLazyLoading();
		lists.get(0).getUser();
		sqlSession.close();
	}
}

显然通过测试:在第一次获取lists集合,集合中的元素中user属性为空,当获取user后,lists集合中元素的user属性就不为空。

原文:https://blog.csdn.net/ITITII/article/details/79999481

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值