• 8.Mybatis的延迟加载


    视频地址: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数据的时候,就查询了两次。

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

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

  • 相关阅读:
    五、Java对象和类
    四、JavaString字符串
    三、Java语句
    二、Java基本数据类型
    一、Java主类结构
    bat常用命令
    iOS 如何获得app的版本和系统的版本
    英语----时态---将来时态的四种对比
    英语----时态---将来时态的
    英语----时态---现在进行时与过去进行时
  • 原文地址:https://www.cnblogs.com/huaixiaoz/p/5799910.html
Copyright © 2020-2023  润新知