Mybatis 测试延迟加载
在学习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 测试延迟加载的更多相关文章
- 8.Mybatis的延迟加载
在Mybatis中的延迟加载只有resultMap可以实现,ResultMap 可以实现高级映射(association,collection可以实现一对1和一对多的映射),他们具有延迟加载的功能,r ...
- mybatis的延迟加载、一级缓存、二级缓存
mybatis的延迟加载.一级缓存.二级缓存 mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入 ...
- Mybatis的延迟加载和立即加载
Mybatis的延迟加载和立即加载 示例:在一对多中,当我们有一个用户,他有100个帐户 问题1:在查询用户时,要不要把关联的账户查出来? 问题2:在查询账户时,要不要把关联的用户信息查出来? 问题1 ...
- Mybatis之延迟加载机制
1. 延迟加载的含义: 用到的时候才会去进行相关操作 2. 延迟加载的例子: 2.1 spring的BeanFactory,在getBean()的时候才创建Bean 2.2 物理分页查询,只有点击 ...
- Mybatis的延迟加载和缓存
1. MyBatis中的延迟加载,也称为懒加载,是指在进行关联查询时,按照设置延迟加载规则推迟对关联对象的select查询.延迟加载可以有效的减少数据库压力. 注意:MyBatis的延迟加 ...
- MyBatis学习--延迟加载
简介 在resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能.例如:我们查询订单并 ...
- 七 mybatis的延迟加载
1 延迟加载 1.1 什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.coll ...
- mybatis的延迟加载
1. 什么是延迟加载 举个例子: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单 ...
- mybatis实现延迟加载多对一
1.数据库表 CREATE TABLE `country` ( `cid` ) NOT NULL AUTO_INCREMENT COMMENT '国家id', `cname` ) COLLATE ut ...
随机推荐
- ios数据持久化(转)
文件系统 归档和序列化 数据库 1.文件系统 不管是Mac OS X 还是iOS的文件系统都是建立在UNIX文件系统基础之上的. 1.1 沙盒模型 在iOS中,一个App的读写权限只局限于自己的沙盒目 ...
- 解决Android4.3版本下,手机短彩接收中文文件名附件,中文名字的附件无法保存(第二步:解决从从数据库中读取附件文件名,并在长按后保存附件时,中文乱码导致的无法保存附件)
从第一步我们发现,在第一步修改之后,在短彩绘画界面中中文附件名的附件已无法显示,经过打印堆栈我们发现还是中文乱码在作祟.下面我们接着进行分析,这次我们从UI层往逻辑处理层进行分析.首先我们找到保存附件 ...
- SSH项目搭建(三)——Maven多模块搭建项目
多模块开发,大致的思想就是把一个项目按某种方式分成多个模块,再把模块们连接成一个整体,我们在开发的时候,可以很清晰的操作每一个模块,可以大大提高开发的效率. Java web项目,最常见的就是按代码的 ...
- caffe安装编译问题-ImportError: No module named google.protobuf.internal
问题描述 ~/Downloads/caffe$ python Python (default, Dec , ::) [GCC ] on linux2 Type "help", &q ...
- js 获取客户端mac地址
js 获取客户端mac地址 javascript获取客户端网卡MAC地址和IP地址和计算机名 nodesj如何获得客户端的mac地址呢? 浏览器获取MAC地址 不限浏览器的mac地址取得的几种办法 I ...
- 20155328 2016-2017-2 《Java程序设计》第5周学习总结
教材学习内容总结 程序设计本身的错误,建议使用Exception或其子类实例来表现. Java中所有错误都会被打包成对象. 如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块将永远 ...
- UTF-8编码占几个字节?
占2个字节的:带有附加符号的拉丁文.希腊文.西里尔字母.亚美尼亚语.希伯来文.阿拉伯文.叙利亚文及它拿字母则需要二个字节编码 占3个字节的:基本等同于GBK,含21000多个汉字 占4个字节的:中日韩 ...
- hdu 5184 类卡特兰数+逆元
BC # 32 1003 题意:定义了括号的合法排列方式,给出一个排列的前一段,问能组成多少种合法的排列. 这道题和鹏神研究卡特兰数的推导和在这题中的结论式的推导: 首先就是如何理解从题意演变到卡特兰 ...
- 前端基础之CSS快速入门
前一篇写了我们的Html的常用组件,当然那些组件在我们不去写样式的时候都是使用的浏览器的默认样式,可以说是非常之丑到爆炸了,我们肯定是不能让用户去看这样丑到爆炸的样式,所以我们在这里需要使用css样式 ...
- 标 题: Re: 总感觉IT没我大山东啥事?
发信人: liuzhlai (liuzhlai), 信区: ITExpress 标 题: Re: 总感觉IT没我大山东啥事? 发信站: 水木社区 (Sat Aug 22 15:51:50 2015) ...