zoukankan      html  css  js  c++  java
  • 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数据的时候,就查询了两次。

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

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

  • 相关阅读:
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    OA办公系统 Springboot Activiti6 工作流 集成代码生成器 vue.js 前后分离 跨域
    java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架
    java OA办公系统源码 Springboot Activiti工作流 vue.js 前后分离 集成代码生成器
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    java 视频播放 弹幕技术 视频弹幕 视频截图 springmvc mybatis SSM
    最后阶段总结
    第二阶段学习总结
    第一阶段学习总结
  • 原文地址:https://www.cnblogs.com/huaixiaoz/p/5799910.html
Copyright © 2011-2022 走看看