在上一篇博客中,我们提到过有关于Mybatis输出映射中resultMap能够实现延迟加载的事,然而真的是所有的resultMap都能实现延迟加载还是咋地啊?现在我们就来对那一句话做一下阐述和实例说明。

一、首先我们要知道什么是延迟加载?

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作;可以简单理解为,只有在使用的时候,才会发出sql语句进行查询;延迟加载的有效期是在session打开的情况下,当session关闭后,会报异常。当调用load方法加载对象时,返回代理对象,等到真正用到对象的内容时才发出sql语句。

总结:需要查询关联信息时,使用mybatis延迟加载特性可有效的减少数据库压力,首次查询只查询主要信息,              关联信息等用户获取时再加载。我们已知的除了hibernate,还有我们的Mybatis。

二、实战演练场:

(1)需求:还以我们的上面两篇文章的电商项目查询订单信息为例,这次,我们以订单信息为主要查询表,然后关联查询对应的用户信息。那什么是延迟加载呢,就是我们默认先只查询订单信息,当我们需要客户信息的时候呢,我们再去关联查询用户信息。这就是延迟加载了。

(2)pojo类的设计:

首先是订单类:

  1. public class Orders {
  2. private Integer id;
  3. private Integer userId;
  4. private String number;
  5. private Date createtime;
  6. private String note;
  7. private User user;
  8. //getter、setter
  9. }

用户信息类:

  1. public class User {
  2. private int id;
  3. private String username;
  4. private int sex;
  5. private Date birthday;
  6. private String address;
  7. //getter、setter
  8. }

再就是我们Mapper映射文件离间对resultMap的定义:

  1. <pre code_snippet_id="2062392" snippet_file_name="blog_20161220_3_5346738" name="code" class="html"><resultMap type="com.ssm.mybatis.po.Orders" id="selectOrderUserLazyLoading">
  2. <!-- 配置映射的订单信息 -->
  3. <id column="id" property="id"/>
  4. <result column="user_id" property="userId"/>
  5. <result column="number" property="number"/>
  6. <result column="createtime" property="createtime"/>
  7. <result column="note" property="note"/>
  8. <!-- 配置映射的用户信息 -->
  9. <association property="user" javaType="com.ssm.mybatis.po.User"
  10. select="com.ssm.mybatis.mapper.UserMapper.findUserById" column="user_id">
  11. </association>
  12. </resultMap></pre><br>
  13. <br>
  14. <pre></pre>
  15. <p></p>
  16. <pre></pre>
  17. <p></p>
  18. <pre></pre>
  19. <pre></pre>

在这里,注意我们的配置映射的映射信息里面有一个select属性,这里实现的就是我们的延迟加载,后面就是我们定义的查询用户信息的Mapper的命名空间,也可以说是一个指向。

配置文件里面statement对resultMap的调用配置:

  1. <select id="selectOrderUserLazyLoading" resultMap="OrderUserLazyLoadingResultMap" >
  2. select * from orders
  3. </select>

接下来,我们定义一个mapper接口进行测试

  1. public interface OrdersMapper{
  2. List<Orders> findOrderUserLazyLoading() throws Exception;
  3. }

测试:

  1. @Test
  2. public void selectOrderUserLazyLoading(){
  3. SqlSession session=sqlSessionFactory.openSession();
  4. OrdersMapperCustom ordersMapperCustomMapper=session.getMapper(OrdersMapperCustom.class);
  5. try {
  6. List<Orders> list=ordersMapperCustomMapper.findOrderUserLazyLoading();//查询订单信息
  7. if (list!=null) {//此处有断点
  8. System.out.println(list.get(0).getUser().getUsername());//查询第一个订单的用户信息
  9. }
  10. } catch (Exception e) {//此处有断电
  11. e.printStackTrace();
  12. }
  13. }

在上面的测试代码里面,我们执行断点查询,分别在if和catch上打一个端点,看tomcat的日志信息

大家可以看到,当我们执行到第一个断点的时候,这里mybatis只发出一条查询订单信息的sql去查询所有的订单信息。接下来,我们继续往下走:

大家看到了,当我们执行到想要获取第一个订单的用户信息时,它又发出了另一条根据id查询用户信息的sql,也就是说,当我们需要调用用户信息的查询方法时,它才会才会去执行查询,这也就是我们所说的延迟加载,也叫做懒加载。大家可以很明显的看到,在这里我们使用的association来实现的延迟加载,其使用collection也一样,至于使用association和collection有什么区别呢,前面我们也介绍过,association是将关联信息映射到一个pojo对象中,而collection是将关联消息映射到list结合中,就这么简单的理由

三、如何配置Mybatis延迟加载(懒加载)

首先我们要知道,Mybatis默认是不支持执行延迟加载(懒加载)的,这需要我们手动去配置,去打开开关。而我们可以总结一下,但我们需要设置开启二级缓存的时候,我们首先需要在Mybatis全局配置文件也就是我们的sqlMapConfig.xml中去设置开启二级缓存,然后再去每个具体mapper映射文件中去确认本映射文件开启二级缓存,也就是所有的全局性的功能或者是性能配置总阀门都在全局配置文件中的。所以我们是否开启延迟加载的这一项功能也是在sqlMapConfig.xml中进行配置:

  1. <settings>
  2. <setting name="lazyLoadingEnabled" value="true"/><!--延迟加载/懒加载-->
  3. <setting name="aggressiveLazyLoading" value="false"/><!--积极加载/预加载-->
  4. </settings>

然后如何在禁止懒加载的配置就不用再介绍了吧。

另外呢,通过看师哥师姐的博客以及外面人的介绍,mybatis的全局配置文件中的标签是有先后顺序的,按序分别是:properties、settings、typeAlliases、typeHandlers、objectFactory、plugins、environments、mappers。究竟是为什么呢,为了探究这个问题,我故意使用原生的mybatis(不与spring整合)配错一个,结果真的如是个所说,报错:

"元素类型为configuration的内容必须匹配(properties?,settings?,typeAliases?,typeHandlers?……"

相关知识:http://www.cnblogs.com/selene/p/4607004.html

四、总结:

以上,就是我们mybatis实现延迟加载的一个简单介绍,那现在回答刚开头时问的问题,是所有的resultMap都能实验延迟加载吗?答案是:mybatis中能实现延时加载的是resultMap,弹死不是所有的resultMap都必须实现延时加载,我们利用的是resultMap里面的association和collection来实现的延迟加载。另外毕竟小编研究mybatis时间不长,难免有所疏漏,若有不足,还请各位指正,必及时修改。

【Mybatis架构】 延迟加载的更多相关文章

  1. mybatis的延迟加载、一级缓存、二级缓存

    mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...

  2. Mybatis的延迟加载和缓存

    1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力.       注意:MyBatis的延迟加 ...

  3. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

  4. 【Mybatis架构】输入、输出映射

    前言综述:   其实在我们分析Mybatis的查询缓存或者是一些简介的时候,我们就不难看到有关于Mybatis输入输出映射的东西,比如说: 但是一直没有想起来系统的来总结一下这方面的相关知识,偶然看到 ...

  5. Mybatis架构学习

    Mybatis架构学习 MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架.MyBatis 封装了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.可以对配置和原生Map使用 ...

  6. 《深入了解mybatis原则》 MyBatis架构设计和案例研究

    MyBatis这是现在很流行ORM框架,这是非常强大.事实上现却比較简单.优雅. 本文主要讲述MyBatis的架构设计思路,而且讨论MyBatis的几个核心部件.然后结合一个select查询实例.深入 ...

  7. SpringMVC,Spring,Hibernate,Mybatis架构开发搭建之SpringMVC部分

    SpringMVC,Spring,Hibernate,Mybatis架构开发搭建之SpringMVC部分 辞职待业青年就是有很多时间来写博客,以前在传统行业技术强度相对不大,不处理大数据,也不弄高并发 ...

  8. Mybatis之延迟加载机制

    1.  延迟加载的含义: 用到的时候才会去进行相关操作 2.  延迟加载的例子: 2.1 spring的BeanFactory,在getBean()的时候才创建Bean 2.2 物理分页查询,只有点击 ...

  9. Mybatis架构简介

    一.Mybatis与ORM 对象关系映射(即Object Relational Mapping,简称ORM),主要用于关系型数据库和实体之间的映射,主要为了解决对象与关系数据库存在的互不匹配的现象,O ...

随机推荐

  1. iTunes Connect 显示可供销售,但是AppStore 就是不显示新版本(异于往常版本更新)

    这次版本更新,从上传到审核通过不足8小时.由于是手动发布,第二天早上上班发布了新版本.但是不同于往常,这次等了很久也不见AppStore 更新新版本.检查一下iTunes Connect ,显示可供销 ...

  2. highcharts去掉版权|去掉水印链接(右下角)_

    credits: {                      enabled: false                  }

  3. Bubble Cup 8 finals H. Bots (575H)

    题意: 简单来说就是生成一棵树,要求根到每个叶子节点上的路径颜色排列不同, 且每条根到叶子的路径恰有n条蓝边和n条红边. 求生成的树的节点个数. 1<=n<=10^6 题解: 简单计数. ...

  4. iPhone屏幕尺寸/launch尺寸/icon尺寸

    屏幕尺寸 6p/6sp     414 X 736 6/6s         375 X 667 5/5s         320 X 568  4/4s         320 X 480   la ...

  5. 关于MapReduce中自定义分组类(三)

    Job类  /**    * Define the comparator that controls which keys are grouped together    * for a single ...

  6. 用swing也可以做出好看的界面

    用Swing做出的例子:JavaFX做出的界面:后来又做出了自己编写的一套基于Synth的L&F,其与直接在代码中重绘某个组件不同,最大优点是具有可插拔性,即在不改变原有程序代码的情况下,用户 ...

  7. Gogland 个性化设置

    1.去掉 hints 提示功能: Preferences -> Editor -> General -> Appearance -> 去掉勾选 “Show parameter ...

  8. VB常用字符串操作函数

    1. ASC(X),Chr(X):转换字符字符码 [格式]: P=Asc(X) 返回字符串X的第一个字符的字符码 P=Chr(X) 返回字符码等于X的字符 [范例]: (1)P=Chr(65) ‘ 输 ...

  9. Thrift的TJsonProtocol协议分析

    Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原 ...

  10. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...