在学习mybatis的延迟加载时,对 lazyLoadingEnabled 和 aggressiveLazyLoading 的区别并不理解,特别是对查询的条件不同时,执行的查询语句也不一样,所以还是测试总结一下

Blog: 

    private Integer id;
private String title;
/*private Integer authorId;*/
private Author author;
private String state;
private Boolean featured;
private String style; Author:   private Integer id;
private String username;
private String password;
private String email;
private String bio;
private String favouriteSection;
private String nickname;
private String realname;

测试用例如下:

1.1 使用默认配置,不查询任何属性

test:

   @Test
public void testSelectBlogByIdLazyLoading() { SqlSession session = MyBatisUtil.getSqlsession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class); System.out.println("查询blog");
Blog blog = blogMapper.selectBlogById(1);
session.close(); System.out.println("查询结束");
} console:     查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==>  Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    ====>  Preparing: select * from author where id = ?
    ====> Parameters: 1(Integer)
    <====      Total: 1
    <==      Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询结束 result:
    使用默认的配置,并且不对blog进行任何属性的查询,但是仍然执行了对author表的查询

1.2 使用默认配置,查询blog的非author属性

test:

@Test
public void testSelectBlogByIdLazyLoading() { SqlSession session = MyBatisUtil.getSqlsession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class); System.out.println("查询blog");
Blog blog = blogMapper.selectBlogById(1);
session.close(); System.out.println("查询blog的title属性");
System.out.println(blog.getTitle());
System.out.println("查询结束");
} console:
  
    查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==>  Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    ====>  Preparing: select * from author where id = ?
    ====> Parameters: 1(Integer)
    <====      Total: 1
    <==      Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询blog的title属性
    My Colourful Garden
    查询结束 result:
  
  使用默认配置,只对blog的非author属性进行查询,但是结果和test1.1一样,都执行了对author表的查询

1.3 使用默认配置,查询blog的属性(包括author属性)

test:

    @Test
public void testSelectBlogByIdLazyLoading() { SqlSession session = MyBatisUtil.getSqlsession();
BlogMapper blogMapper = session.getMapper(BlogMapper.class); System.out.println("查询blog");
Blog blog = blogMapper.selectBlogById(1);
session.close(); System.out.println("查询blog的title属性");
System.out.println(blog.getTitle());
        System.out.println("查询blog的author属性");
        System.out.println(blog.getAuthor().getUsername());
System.out.println("查询结束");
} console:
  
    查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    ====> Preparing: select * from author where id = ?
    ====> Parameters: 1(Integer)
    <==== Total: 1
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询blog的title属性
    My Colourful Garden
    查询blog的author属性
    helen
    查询结束 result:
  
  使用默认配置,对blog属性(包括author属性)进行查询,但是结果和test1.1以及test1.2一样,都执行了对author表的查询

2.1 配置 lazyLoadingEnabled:true; 不查询任何属性

 config:

   <!-- 延迟加载 默认不开启 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings> test:
  
  @Test
  public void testSelectBlogByIdLazyLoading() {      SqlSession session = MyBatisUtil.getSqlsession();
     BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    
     System.out.println("查询blog");
     Blog blog = blogMapper.selectBlogById(1);
     session.close();
System.out.println("查询结束");
}
console:
  
    查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询结束 result:
  
  配置 lazyLoadingEnabled:true,并且不对blog进行任何属性查询,则session只执行对本表的查询

2.2 配置 lazyLoadingEnabled:true; 查询blog的非author属性

 config:

   <!-- 延迟加载 默认不开启 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings> test:
  
  @Test
  public void testSelectBlogByIdLazyLoading() {      SqlSession session = MyBatisUtil.getSqlsession();
     BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    
     System.out.println("查询blog");
     Blog blog = blogMapper.selectBlogById(1);
     session.close();      System.out.println("查询blog的title属性");
     System.out.println(blog.getTitle());
System.out.println("查询结束");
} console:
  
    查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询blog的title属性
    Opening JDBC Connection
    Checked out connection 1263877414 from pool.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==>  Preparing: select * from author where id = ?
    ==> Parameters: 1(Integer)
    <==      Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    My Colourful Garden
    查询结束 result:
  
  配置 lazyLoadingEnabled:true,并且对blog进行非author查询,则session先执行对本表的查询,然后执行对author表的查询

2.3 配置 lazyLoadingEnabled:true;查询blog的属性(包括author属性)

config:

   <!-- 延迟加载 默认不开启 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
</settings> test:
  
  @Test
  public void testSelectBlogByIdLazyLoading() {      SqlSession session = MyBatisUtil.getSqlsession();
     BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    
     System.out.println("查询blog");
     Blog blog = blogMapper.selectBlogById(1);
     session.close();      System.out.println("查询blog的title属性");
     System.out.println(blog.getTitle());
        System.out.println("查询blog的author属性");
        System.out.println(blog.getAuthor().getUsername());
System.out.println("查询结束");
} console:
  
    查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询blog的title属性
    Opening JDBC Connection
    Checked out connection 1263877414 from pool.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from author where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    My Colourful Garden
    查询blog的author属性
    helen
    查询结束 result:
  
  配置 lazyLoadingEnabled:true,并且对blog进行author查询,则结果和test2.2一样,session先执行对本表的查询,然后执行对author表的查询

3.1 配置lazyLoadingEnabled:true;aggressiveLazyLoading:false;  不查询任何属性

  config:

   <!-- 延迟加载 默认不开启 -->
    <!-- 默认是积极的懒加载 -->
    <settings>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>   test:
    @Test 
    public void testSelectBlogByIdLazyLoading() {        SqlSession session = MyBatisUtil.getSqlsession();
       BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    
       System.out.println("查询blog");
       Blog blog = blogMapper.selectBlogById(1);
       session.close();
   System.out.println("查询结束");
   }   console:
     查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询结束   result:     配置 lazyLoadingEnabled:true,aggressiveLazyLoading:false; 并且不对blog进行任何查询,则session只执行对本表的查询

3.2 配置lazyLoadingEnabled:true;aggressiveLazyLoading:false;  查询非author属性

 config:

   <!-- 延迟加载 默认不开启 -->
  <!-- 默认是积极的懒加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
     <setting name="aggressiveLazyLoading" value="false"/>
</settings> test:
  
  @Test
  public void testSelectBlogByIdLazyLoading() {      SqlSession session = MyBatisUtil.getSqlsession();
     BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    
     System.out.println("查询blog");
     Blog blog = blogMapper.selectBlogById(1);
     session.close();      System.out.println("查询blog的title属性");
     System.out.println(blog.getTitle()); System.out.println("查询结束");
} console:
  
    查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询blog的title属性
    My Colourful Garden
    查询结束 result:
  
  配置 lazyLoadingEnabled:true,aggressiveLazyLoading:false ;并且对blog进行非author查询,则session只执行对本表的查询

3.3 配置lazyLoadingEnabled:true;aggressiveLazyLoading:false;  查询blog的属性(包括author属性)

config:

   <!-- 延迟加载 默认不开启 -->
  <!-- 默认是积极的懒加载 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
     <setting name="aggressiveLazyLoading" value="false"/>
</settings> test:
  
  @Test
  public void testSelectBlogByIdLazyLoading() {      SqlSession session = MyBatisUtil.getSqlsession();
     BlogMapper blogMapper = session.getMapper(BlogMapper.class);
    
     System.out.println("查询blog");
     Blog blog = blogMapper.selectBlogById(1);
     session.close();
    
     System.out.println("查询blog的title属性");
        System.out.println(blog.getTitle());
        System.out.println("查询blog的author属性");
        System.out.println(blog.getAuthor().getUsername());
System.out.println("查询结束");
} console:
  
    查询blog
    Opening JDBC Connection
    Created connection 1263877414.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from blog where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    查询blog的title属性
    Opening JDBC Connection
    Checked out connection 1263877414 from pool.
    Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    ==> Preparing: select * from author where id = ?
    ==> Parameters: 1(Integer)
    <== Total: 1
    Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@4b553d26]
    Returned connection 1263877414 to pool.
    My Colourful Garden
    查询blog的author属性
    helen
    查询结束 result:
  
  配置 lazyLoadingEnabled:true;aggressiveLazyLoading:false; 并且对blog进行author查询,则session先执行对本表的查询,然后执行对author表的查询
在默认配置下,无论是否对blog的属性进行查询,session都会执行对blog表和对author表两条查询语句,然后存入缓存中,供查询结果调用,称为不延迟加载;

在配置lazyLoadingEnabled:true 后,如果不对blog的任何属性进行查询,session只会执行查询blog的语句;但是只要对blog的任意属性进行查询,就会查询blog表和author表,然后放入缓存,共查询结果调用,称为积极的延迟加载;

在配置 lazyLoadingEnabled:true;aggressiveLazyLoading:false;后,如果不对blog的author属性进行查询,session只会执行查询blog的语句;如果查询了blog的author属性,就会继续查询author,成为不积极的延迟加载

MyBatis的缓存机制:

  参考链接:http://blog.csdn.net/luanlouis/article/details/41390801

  MyBatis的缓存分为一级缓存和二级缓存

  一级缓存是session级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称为本地缓存;一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(可以通过开发插件对它进行修改)

  二级缓存是Application应用缓存的缓存,它的生命周期很长,跟Application的声明周期一样,作用范围是整个Application应用

Mybatis 测试延迟加载的更多相关文章

  1. 8.Mybatis的延迟加载

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

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

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

  3. Mybatis的延迟加载和立即加载

    Mybatis的延迟加载和立即加载 示例:在一对多中,当我们有一个用户,他有100个帐户 问题1:在查询用户时,要不要把关联的账户查出来? 问题2:在查询账户时,要不要把关联的用户信息查出来? 问题1 ...

  4. Mybatis之延迟加载机制

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

  5. Mybatis的延迟加载和缓存

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

  6. MyBatis学习--延迟加载

    简介 在resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能.例如:我们查询订单并 ...

  7. 七 mybatis的延迟加载

    1       延迟加载 1.1     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.coll ...

  8. mybatis的延迟加载

    1. 什么是延迟加载 举个例子: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单 ...

  9. mybatis实现延迟加载多对一

    1.数据库表 CREATE TABLE `country` ( `cid` ) NOT NULL AUTO_INCREMENT COMMENT '国家id', `cname` ) COLLATE ut ...

随机推荐

  1. Robolectric测试框架使用笔记

    1. 概述 Robolectric(http://robolectric.org/)是一款支持在桌面JVM模拟Android环境的测试框架,通过shadow包下的类来截取view.activity等类 ...

  2. Linux/Unix下Shell快捷键操作集合

    本人收集整理了一些Bash或其他Shell中常用的快捷键,使用技巧以及Ubuntu中一些常用操作的快捷键,希望大家能从中受益,提高工作效率. 使用”!”从历史中执行命令 有时候,我们需要在 Bash ...

  3. 将整个文件夹推上github

    /*游戏或者运动才能让我短暂的忘记心痛,现如今感觉学习比游戏和运动还重要——曾少锋*/ 首先你要有一个本地仓库和一个远程仓库(github中的仓库).git文件夹下面不能含有 git文件夹,如果有的话 ...

  4. 了解 .NET 的默认 TaskScheduler 和线程池(ThreadPool)设置,避免让 Task.Run 的性能急剧降低

    .NET Framework 4.5 开始引入 Task.Run,它可以很方便的帮助我们使用 async / await 语法,同时还使用线程池来帮助我们管理线程.以至于我们编写异步代码可以像编写同步 ...

  5. hiho1622 有趣的子区间(YY)

    题目链接:http://hihocoder.com/problemset/problem/1622?sid=1230113 #1622 : 有趣的子区间 时间限制:10000ms 单点时限:1000m ...

  6. 如何判断一个请求是否为AJAX请求

    普通请求与ajax请求的报文头不一样,通过如下 String requestType = request.getHeader("X-Requested-With");  如果req ...

  7. 2019第1周日-MQ选型要点

    用消息中间件犹如小马过河,选择合适的才最重要,这需要贴合自身的业务需求,技术服务于业务.具体在选择上可从下面功能.性能.可靠性和可用性.运维管理.社区和生态.团队技术栈等维度来进行筛选. 具体技术选型 ...

  8. nexus7 升级失败后手动刷系统

    http://bbs.gfan.com/android-6934570-1-1.html   步骤如下: 1. 下载Android系统文件,打开官方地址:https://developers.goog ...

  9. 【转】每天一个linux命令(20):find命令之exec

    原文网址:http://www.cnblogs.com/peida/archive/2012/11/14/2769248.html find是我们很常用的一个Linux命令,但是我们一般查找出来的并不 ...

  10. 数独求解程序 php版

    数独求解程序 php版 <?php class Sudoku { var $matrix; function __construct($arr = null) { if ($arr == nul ...