程序员JavaWeb学习

延迟加载

2018-05-27  本文已影响9人  幻影翔

意义

在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。

如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关联查询,当需要关联信息再查询这个叫延迟加载。

mybatis中resultMap提供延迟加载功能,通过resultMap配置延迟加载。

配置

在collection/association中加入select内容

  <!-- SqlMapConfig.xml中编写全局配置参数 -->
<settings>
    <!-- 延迟加载总开关 -->
    <setting name="lazyLoadingEnabled" value="true" />  
    <!-- 设置按需加载 -->
    <setting name="aggressiveLazyLoading" value="false" />
</settings>

<association 
   property="user"  select="mapper.UserMapper.findUserById" column="user_id">
</association>

需求例子

查询订单及用户的信息,一对一查询。

刚开始只查询订单信息。

当需要用户时调用 Orders类中的getUser()方法执行延迟加载 ,向数据库发出sql。

实现的测试代码

 <!--开始只查询订单,对用户信息进行延迟加载 -->
  
 <select id="findOrderUserListLazyLoading" resultMap="orderCustomLazyLoading">
     SELECT 
      orders.*
    FROM
      orders
 </select>
//一对一查询延迟加载
@Test
public void testFindOrderUserListLazyLoading() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
    // 创建mapper代理对象
    OrdersMapperCustom ordersMapperCustom = sqlSession
            .getMapper(OrdersMapperCustom.class);

    // 调用方法
    List<Orders> list = ordersMapperCustom.findOrderUserListLazyLoading();
    
    //这里执行延迟加载,要发出sql
    User user = list.get(0).getUser();
    System.out.println(user);
    
}

使用场景

延迟加载:

resultType:

resultMap:

使用association和collection完成一对一和一对多高级映射。

association:

collection:

上一篇下一篇

猜你喜欢

热点阅读