MyBatis 之 延迟加载(Lazy Load)

1. LazyLoad 的作用:

    在数据与对象进行 mapping 操作时,只有在真正使用到 该对象时,才进行 mapping 操作,以减少数据库查询开销,从而提升系统性能

    但是Lazy Load也有缺点,在 按需加载时会多次连接数据库,同时会增加数据库的压力。所以在实际使用时,会衡量是否使用 延迟加载。

2. 实现:

    1)在 sqlMapConfig.xml 文件中配置 Lazy Load 的开关。

<settings>
	<!-- 开启全局性设置懒加载 -->
	<setting name="lazyLoadingEnabled" value="true"/>
	<!-- 开启按需加载 -->
	<setting name="aggressiveLazyLoading" value="false"/>
</settings>

    2)在 sqlMapper.xml 映射文件中中配置sql映射,这里是一对一查询<association>,也可用在 <collection>中

<!-- 订单及用户信息, Lazy Load -->
<resultMap id="orderAndUser" type="mybatis_b.model.Order">
  <!-- id 这里表示结果集的唯一主键,虽然出现重复的orderDetail,但是属于同一个orderId -->
  <id property="orderId" column="orderId"/>
  <result property="user_id" column="user_id"/>
  <result property="orderNumber" column="orderNumber"/>
  <!-- 延迟加载,通过 findUserById 来查询User 信息, column="user_id" 是上面查询出来的userid,作为parameterType传入到 findUserById 方法 -->
  <association property="user" javaType="mybatis_b.model.User" select="findUserById" column="user_id">
  	<!-- 这里可以使用延迟加载来查询User信息,通过  findUserById 
  	<id property="userId" column="userId"/>
	<result property="username" column="username"/>
	<result property="sex" column="sex"/>
	<result property="birthday" column="birthday"/>
	<result property="address" column="address"/>
	<result property="detail" column="detail"/>
	<result property="score" column="score"/>
  	-->
  </association>
</resultMap>
  
<!-- user 查询 -->
<select id="findUserById" parameterType="int" resultType="user">
  select * from users where userId = #{user_id}
</select>
  
<select id="findOrderAndUser_lazyLoad" resultMap="orderAndUser">
  select * from orders
</select>

    3)定义 mapper 接口,并调用接口方法

//延迟加载
	@Test
	public void testFindOrderAndUser_lazyLoad() throws Exception {
		//获取SqlSession
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//指定 mapper 接口的类型,MyBatis通过动态代理的方式实现mapper接口
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		
		List<Order> list = orderMapper.findOrderAndUser_lazyLoad();
		
		System.out.println(list.size());
		//Iterator<Order> iterator = list.iterator();
		//while (iterator.hasNext()) {
			//Order order = (Order) iterator.next();
			//System.out.println(order.getUser());
		//}
	}

    执行结果:

MyBatis 之 延迟加载(Lazy Load)_第1张图片

    如果去掉上面代码注释的部分,那么就调用了getUser()的方法,mybatis 会自动调用 findUserById() 去获取 User信息。结果如下:

MyBatis 之 延迟加载(Lazy Load)_第2张图片

如果关闭了 Lazy Load,那么结果是这样的:

MyBatis 之 延迟加载(Lazy Load)_第3张图片

你可能感兴趣的:(延迟加载(lazy,Load))