15.延迟加载

1.什么是延迟加载

resultMap可以实现高级映射,association、collection具备延迟加载功能。
延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表要比关联查询速度快。

2.根据订单查询相关联用户,使用延迟加载

  • sql语句(子查询)
SELECT * ,
(SELECT `user`.username FROM user WHERE `user`.id=orders.user_id)username
FROM orders
15.延迟加载_第1张图片
  • mapper.xml

1.只查询订单信息

 

2.关联查询用户信息
通过上边查询到的订单信息中的user_id去关联查询用户信息。
使用UserMapper.xml中的findUserById。

  

上边先去执行findOrdersUserLazyLoading,需要查询用户信息的时候再执行findUserById。

  • resultMap的配置
    使用association中的select指定延迟加载去执行的statement的id。
    
        
        
        
         
        

        
    
  • OrderCustomMapper.java
//查询订单关联查询用户,用户信息延迟加载
    public List findOrdersUserLazyLoading() throws Exception;
  • 延迟加载配置
    mybatis默认没有开启延迟加载,需要在sqlMapConfig.xml中setting配置。
15.延迟加载_第2张图片
 
        
        
    
  • 测试
    1.执行mapper方法findOrdersUserLazyLoading,内部去调用com.chinglee.mybatis.mapper.OrderCustomMapper中的findOrdersUserLazyLoading,只查询到orders信息(单表)
    2.在程序中去遍历上一步骤查询出的List,当我们调用Orders中的getUser方法时,开始延迟加载。
    3.延迟加载,去调用UserMapper.xml中findUserbyId方法获取用户信息。
 //查询订单关联查询用户延迟加载
    public void findOrdersUserLazyLoadingTest() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        //创建代理对象
        OrderCustomMapper orderCustomMapper= sqlSession.getMapper(OrderCustomMapper.class);
        //调用mapper的方法
        List list =orderCustomMapper.findOrdersUserLazyLoading();
        //遍历上边的订单列表
        for(Orders orders:list){
            //执行getUser
            User user=orders.getUser();
            System.out.println(user);
        }
        sqlSession.close();
    }

总之:
使用延迟加载方法,先去查询简单的sql(最好单表,也可以是关联的表),再去按需加载关联查询的其他信息。

你可能感兴趣的:(15.延迟加载)