视频地址:http://edu.51cto.com/sd/be679

  在Mybatis中的延迟加载只有resultMap可以实现,ResultMap 可以实现高级映射(association,collection可以实现一对1和一对多的映射),他们具有延迟加载的功能,resultType不具有延迟加载的功能。

  所谓的延迟加载就是:你需要的时候再去查,比如:你先查询订单表的全部记录,有需要的时候在去查订单详情表的记录,你有需要的时候再去拿,总比你一次性取出来来的好。可以提高数据库的性能。延迟加载需要配置大概分为以下几步。

  1.在全局配置中开启延迟加载

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

  2.在resultMap定义延迟加载

<resultMap type="com.etc.entity.Orders" id="lazyResultMap">
  <!-- 配置要映射的订单信息 -->
  <id column="oid" property="oid" />
  <result column="uid" property="uid" />
  <result column="phone" property="phone" />
  <result column="address" property="address" />
  <!--
    select:指定延迟加载的要执行的statement的id
    column:关联信息的列名
  -->
  <association property="orderDetail" javaType="com.etc.entity.OrderDetail"
    select="findById" column="oid"></association>
</resultMap>

  3.延迟加载的select语句

<select id="findAll" resultMap="lazyResultMap">
        select * from orders
    </select>
<!--根据ID查询详情表-->
    <select id="findById" parameterType="int" resultType="com.etc.entity.OrderDetail">
        select *
        from orderdetail where oid=#{oid}
    </select>

  4.测试延迟加载

    @Test
    public void lazy() throws IOException{
        //mybatis的配置文件
        String resource="mybatis-config.xml";
        //得到配置文件流
        InputStream inputStream= Resources.getResourceAsStream(resource);
        //创建会话工厂,需要传入Mybatis的配置文件信息
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession session=sessionFactory.openSession();
        //第一个参数:映射文件中的statement的id:命名空间+id
        //第二个参数:就是指定和映射文件中匹配的参数
        UsersMapper usersMapper= session.getMapper(UsersMapper.class);
        //1.只调用到findAll方法时候
        List<Orders>orders=usersMapper.findAll();
        for (Orders orders2 : orders) {
            System.out.println(orders2);
        }
        //2.查找全部后通过orders去取订单详情信息的时候
        List<OrderDetail> orderDetails=orders.get(0).getOrderDetail();
        for (OrderDetail orderDetail : orderDetails) {
            System.out.println(orderDetail);
        }
    }
}

  分析结果理解延迟加载:

    1.只调用到findAll方法的时候运行结果(只发起了一次的查询语句)

    2.查找全部后通过orders去取订单详情信息的时候(发起了两次查询语句)

  这里注意看,第一次测试的时候没有去取orderDetail数据的时候,只查询了一次。

        第二次测试的时候有去取orderDetail数据的时候,就查询了两次。

  这里说明你有需要的时候才去查询,没有需要的时候就不查询,所以这个就是延迟加载

  (测试的时候分两次测试,如果不分开的话,第二次查询会走缓存,下面介绍一级缓存和二级缓存)