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

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

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

最新文章

  1. Java类的加载の动态
  2. java压缩
  3. Daikon Forge GUI 制作UI面板
  4. Winform窗体事件发生顺序
  5. [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法
  6. Mock框架
  7. sshd_config配置 详解
  8. 《LINUX程序设计 第四版》 阅读笔记:(一)
  9. DateTime.ToString格式化日期,使用DateDiff方法获取日期时间的间隔数
  10. Layer 1: Single Objects
  11. window.open()具体解释及浏览器兼容性问题
  12. php_cawler_html嵌套标签清洗
  13. 如何实现MDI窗体不重复打开同一个子窗体?
  14. Android中软键盘弹出时底部菜单上移问题
  15. error lnk1158 无法运行rc.exe
  16. socket 简单了解
  17. java工程操作redis
  18. webpack dev server 配置 启动项目报错Error: listen EADDRINUSE
  19. bzoj 3232: 圈地游戏
  20. Spring自动装配Beans

热门文章

  1. web安全之sql注入实例(5.0之前的)
  2. [转]STL中vector转数组(实际是数组的指针)
  3. JavaScript 字符串转日期
  4. 一些鲜为人知却非常实用的数据结构 - Haippy
  5. Win7打补丁以后vs2012突然出现的程序版本不兼容问题
  6. CSS id 选择器
  7. Xcode解决代码高亮、语法提示、错误警告等功能失效的解决方法
  8. Joint Deep Learning for Pedestrian Detection笔记
  9. SVD分解的理解[转载]
  10. PHP入门part1