Mybatis 测试延迟加载
2024-10-15 18:18:15
在学习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应用
最新文章
- Add Indexer to DynamicJson
- 使用 CommandLineApplication 类创建专业的控制台程序
- Advanced Collection Views and Building Custom Layouts
- The Tower of Babylon
- 发送带有认证信息的HTTP请求并取回响应
- WebStorm JavaScript 开发神器
- Unity启动事件-监听:InitializeOnLoad
- mui开发app之js将base64转图片文件
- 最近ssh遇到异常及解决
- 【shell点滴】参数变量
- 微信小程序UI组件、开发框架、实用库...
- [luogu P3391] 文艺平衡树
- Groovy学习笔记-陷阱
- Spark基础-scala学习(八、隐式转换与隐式参数)
- 3ds max学习笔记(十二)-- (弯曲:实例旋转楼梯)
- python全栈开发* 02 知识点汇总 * 180531
- 使用python-aiohttp爬取今日头条
- Orchard Core 增加了一个API模块,要怎么调用
- webscan v0.01
- window 窗口编辑
热门文章
- Linux下Bind error: Address already in use处理
- sql,用 ISNULL(), NVL(), IFNULL() and COALESCE() 函数替换空值
- uva1482:Playing With Stones (SG函数)
- CH4302 Interval GCD
- c2java Greedy 之任务调度
- PythonWeb开发教程(一),开发之前需要准备什么
- 7 无线wifi传输视频开发
- 【转】每天一个linux命令(33):df 命令
- spring答题
- jp@gc - Stepping Thread Group 字段说明