package cn.bdqn.test;

import java.util.Iterator;
import java.util.List; import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import cn.bdqn.bean.Student;
import cn.bdqn.util.HibernateSessionUtil; public class StudentTest { Session session=null;
Transaction transaction=null; @Before
public void before(){
//getCurrentSession 必须在事务下运行
session=HibernateSessionUtil.getCurrentSession();
transaction=session.beginTransaction(); //开启事务
} /**
* HQL: hibernate查询语言!
*
* 执行hql的步骤:
* 01.获取session对象
* 02.编写hql语句 使用面向对象的思想! hql中只有类 和属性 !不存在 表和字段
* 03.通过session.createQuery(String hql) 创建Query对象
* 05.执行对应的查询
*/ /**
* list查询所有:
* 01.会立即产生一条select语句!
* select查询出来的所有数据,都会被session管理!保存在缓存中!
* 02.清空或者不清空session缓存中的数据
* 03.再次执行查询的时候 都会执行一条select语句!
*/
@Test
public void testList(){
//Student 必须大写 因为是 类名
String hql="from Student";
//创建Query对象
Query query = session.createQuery(hql);
//执行对应的查询
System.out.println("*************");
List<Student> list = query.list();
System.out.println("*************");
for (Student student : list) {
System.out.println(student);
}
//清空缓存
//session.clear();
//再次执行对应的查询
list = query.list();
for (Student student : list) {
System.out.println(student);
}
} /**
* Iterator:查询所有
*
* 测试环境:数据库中有5条数据
*
* 产生的结果:
* 01.6条select语句
* 02.第一条 是查询数据库表中所有的id,这条语句是query.iterate()产生的!
* 03.其他的5条select语句 都是根据id进行查询!都是在.next()产生的!
*/
@Test
public void testIterator(){
String hql="from Student";
Query query = session.createQuery(hql);
System.out.println("*************");
Iterator<Student> iterate = query.iterate();
System.out.println("*************");
while (iterate.hasNext()) {
System.out.println("*************");
Student stu = iterate.next();
System.out.println("*************");
System.out.println(stu);
}
} /**
* 01.iterate在有缓存的情况下,如果缓存中有查询的所有数据!只会执行一条sql语句!
* 这条sql就是查询所有的id!
* 02.如果缓存中有2条数据! id =1 id=2
* 我们查询了所有的5条数据!
* 这时候会产生多少条sql? 3+1
*/
@Test
public void testIterator2(){
String hql="from Student";
Query query = session.createQuery(hql);
Iterator<Student> iterate = query.iterate();
while (iterate.hasNext()) {
Student stu = iterate.next();
System.out.println(stu);
}
System.out.println("********************");
//再次查询 没有清空缓存
iterate = query.iterate();
while (iterate.hasNext()) {
Student stu = iterate.next();
System.out.println(stu);
}
} /**
* 测试环境:
* 缓存中有两条数据
* 结果:
* 01.get肯定产生sql
* 02.iterate遍历的时候 先去缓存中获取已经存在的数据! 就会减少2次查询!
*/
@Test
public void testIterator21(){
//获取id为1的student对象
Student student1= (Student) session.get(Student.class, 1); // 产生1条
Student student2 = (Student) session.get(Student.class, 2); // 产生1条
System.out.println("*************************");
String hql="from Student";
Query query = session.createQuery(hql);
Iterator<Student> iterate = query.iterate(); // 产生1条
while (iterate.hasNext()) {
Student stu = iterate.next();// 产生4条
System.out.println(stu);
} } /**
*iterate在没有缓存的情况下 会执行N+1条数据!
*N:指的是数据数量!
*1:查询所有的ID!
*/
@Test
public void testIterator3(){
String hql="from Student";
Query query = session.createQuery(hql);
Iterator<Student> iterate = query.iterate();
while (iterate.hasNext()) {
Student stu = iterate.next();
System.out.println(stu);
}
System.out.println("********************");
//再次查询 清空缓存
session.clear();
iterate = query.iterate();
while (iterate.hasNext()) {
Student stu = iterate.next();
System.out.println(stu);
}
} }
/**

    Query接口中的list()和iterate()都可以执行查询操作,
而iterate()能够利用延迟加载和缓存的机制提高查询性能!iterate()查询时,
仅查询ID字段以节省资源。需要使用数据时,再根据ID字段到缓存中检索匹配的实例!
如果存在就直接使用!只有当缓存中没有需要的数据时,iterate()才会执行select语句
!根据ID字段到数据库中查询!iterate()更适用于查询对象开启二级缓存的情况!
*/ list 和 iterato r的区别:

(1)       从上面的执行结果可以看出获取的方式不一样

List的获取方式为:List<Customers> list = query.list();

Iterator的获取方式:Iterator<Customers> it = query.iterate();

(2)从执行结果可以看出list输出一条语句,而iterator输出的是两条sql语句,我们可想一下,为什么会输出这样的效果?

因为他们获取数据的方式不一样,list()会直接查询数据库,iterator()会先到数据库中把id都取出来,然后真正要遍历某个对象的时候先到缓存中找,如果找不到,以id为条件再发一条sql到数据库,这样如果缓存中没有数据,则查询数据库的次数为n+1次

(3)list只查询一级缓存,而iterator会从二级缓存中查

(4)list方法返回的对象都是实体对象,而iterator返回的是代理对象

(5) session中list第二次发出,仍会到数据库査询

(6) iterate 第二次,首先找session 级缓存

hibernate05--list和iterator的更多相关文章

  1. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  2. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  3. [LeetCode] Flatten Nested List Iterator 压平嵌套链表迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  4. [LeetCode] Peeking Iterator 顶端迭代器

    Given an Iterator class interface with methods: next() and hasNext(), design and implement a Peeking ...

  5. [LeetCode] Zigzag Iterator 之字形迭代器

    Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...

  6. [LeetCode] Binary Search Tree Iterator 二叉搜索树迭代器

    Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...

  7. 用vue.js学习es6(六):Iterator和for...of循环

    一.Iterator (遍历器)的概念: 遍历器(Iterator)就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只 要部署Iterator接口,就可以完成遍历操 ...

  8. [转]使用Enumeration和Iterator遍历集合类

    原文地址:http://www.cnblogs.com/xwdreamer/archive/2012/05/30/2526268.html 前言 在数据库连接池分析的代码实例中,看到其中使用Enume ...

  9. 14 Iterator和for...of循环

    Iterator和for...of循环 首先 Iterator 是一个接口. 标准是 function makeIterator(array) { var nextIndex = 0; return ...

  10. JAVA中ListIterator和Iterator详解与辨析

    在使用Java集 合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.ArrayList. LinkedList和Vector的时候可以使用 ...

随机推荐

  1. Collection was modified; enumeration operation may not execute Dictionary 集合已修改;可能无法执行枚举操作

    public void ForeachDic() { Dictionary dic = new Dictionary(); dic.Add("1", 10); dic.Add(&q ...

  2. Error-MVC: “/”应用程序中的服务器错误。

    ylbtech-Error-MVC: “/”应用程序中的服务器错误. 1.返回顶部 1. “/”应用程序中的服务器错误. 运行时错误 说明: 服务器上出现应用程序错误.此应用程序的当前自定义错误设置禁 ...

  3. Mongo 常用操作

    1.查询 [基本形式]db.col.find().pretty():pretty() 方法以格式化的方式来显示所有文档. [获取记录条数]:db.users.find().count(); [读取指定 ...

  4. Spark(四十四):使用Java调用spark-submit.sh(支持 --deploy-mode client和cluster两种方式)并获取applicationId

    之前也介绍过使用yarn api来submit spark任务,通过提交接口返回applicationId的用法,具体参考<Spark2.3(四十):如何使用java通过yarn api调度sp ...

  5. mac 下apache服务的根目录

    根据文章的介绍 http://jingyan.baidu.com/article/67508eb434539f9cca1ce4da.html apache服务的根目录是在 /Library/WebSe ...

  6. Delphi及C++Builder经典图书一览表(持续更新中2018.01.02)

    序号 书名 原版书名 作者 译者 出版社 页数 年代 定价 备注 1 C++Builder 5程序设计大全 C++Builder 5 Developer's Guide Jarrod Hollingw ...

  7. SSH + Google Authenticator 安全加固

    1. SSH连接 Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境.SSH通过在网络中创建安全隧道来实现SSH客户端与服务器 ...

  8. Win10系统的SurfacePro4如何重装系统-3 重装完成之后的系统优化

    重装完成之后,还是有很多问题,比如触摸屏的驱动没了,你要接上去鼠标之后操作   由于Surface只有一个USB口,你接了鼠标,就没法接键盘,所以要开启屏幕的软键盘,右击任务栏,勾选显示触摸键盘按钮, ...

  9. 一步步教你轻松学支持向量机SVM算法之理论篇1

    一步步教你轻松学支持向量机SVM算法之理论篇1 (白宁超 2018年10月22日10:03:35) 摘要:支持向量机即SVM(Support Vector Machine) ,是一种监督学习算法,属于 ...

  10. 关于Discuz! X系列UC_Server 本地文件包含漏洞

    最近又发现discuz论坛被挂马了,决定好好研究一下discuz的漏洞,技术债始终要还是要还的 一.问题发现 快要睡觉的时候,突然收到一封邮件,发现服务器上的文件被篡改了,立即登录服务器,清空恶意文件 ...