1. package cn.bdqn.test;
  2.  
  3. import java.util.Iterator;
  4. import java.util.List;
  5.  
  6. import org.hibernate.Query;
  7. import org.hibernate.Session;
  8. import org.hibernate.SessionFactory;
  9. import org.hibernate.Transaction;
  10. import org.hibernate.cfg.Configuration;
  11. import org.junit.After;
  12. import org.junit.Before;
  13. import org.junit.Test;
  14.  
  15. import cn.bdqn.bean.Student;
  16. import cn.bdqn.util.HibernateSessionUtil;
  17.  
  18. public class StudentTest {
  19.  
  20. Session session=null;
  21. Transaction transaction=null;
  22.  
  23. @Before
  24. public void before(){
  25. //getCurrentSession 必须在事务下运行
  26. session=HibernateSessionUtil.getCurrentSession();
  27. transaction=session.beginTransaction(); //开启事务
  28. }
  29.  
  30. /**
  31. * HQL: hibernate查询语言!
  32. *
  33. * 执行hql的步骤:
  34. * 01.获取session对象
  35. * 02.编写hql语句 使用面向对象的思想! hql中只有类 和属性 !不存在 表和字段
  36. * 03.通过session.createQuery(String hql) 创建Query对象
  37. * 05.执行对应的查询
  38. */
  39.  
  40. /**
  41. * list查询所有:
  42. * 01.会立即产生一条select语句!
  43. * select查询出来的所有数据,都会被session管理!保存在缓存中!
  44. * 02.清空或者不清空session缓存中的数据
  45. * 03.再次执行查询的时候 都会执行一条select语句!
  46. */
  47. @Test
  48. public void testList(){
  49. //Student 必须大写 因为是 类名
  50. String hql="from Student";
  51. //创建Query对象
  52. Query query = session.createQuery(hql);
  53. //执行对应的查询
  54. System.out.println("*************");
  55. List<Student> list = query.list();
  56. System.out.println("*************");
  57. for (Student student : list) {
  58. System.out.println(student);
  59. }
  60. //清空缓存
  61. //session.clear();
  62. //再次执行对应的查询
  63. list = query.list();
  64. for (Student student : list) {
  65. System.out.println(student);
  66. }
  67. }
  68.  
  69. /**
  70. * Iterator:查询所有
  71. *
  72. * 测试环境:数据库中有5条数据
  73. *
  74. * 产生的结果:
  75. * 01.6条select语句
  76. * 02.第一条 是查询数据库表中所有的id,这条语句是query.iterate()产生的!
  77. * 03.其他的5条select语句 都是根据id进行查询!都是在.next()产生的!
  78. */
  79. @Test
  80. public void testIterator(){
  81. String hql="from Student";
  82. Query query = session.createQuery(hql);
  83. System.out.println("*************");
  84. Iterator<Student> iterate = query.iterate();
  85. System.out.println("*************");
  86. while (iterate.hasNext()) {
  87. System.out.println("*************");
  88. Student stu = iterate.next();
  89. System.out.println("*************");
  90. System.out.println(stu);
  91. }
  92. }
  93.  
  94. /**
  95. * 01.iterate在有缓存的情况下,如果缓存中有查询的所有数据!只会执行一条sql语句!
  96. * 这条sql就是查询所有的id!
  97. * 02.如果缓存中有2条数据! id =1 id=2
  98. * 我们查询了所有的5条数据!
  99. * 这时候会产生多少条sql? 3+1
  100. */
  101. @Test
  102. public void testIterator2(){
  103. String hql="from Student";
  104. Query query = session.createQuery(hql);
  105. Iterator<Student> iterate = query.iterate();
  106. while (iterate.hasNext()) {
  107. Student stu = iterate.next();
  108. System.out.println(stu);
  109. }
  110. System.out.println("********************");
  111. //再次查询 没有清空缓存
  112. iterate = query.iterate();
  113. while (iterate.hasNext()) {
  114. Student stu = iterate.next();
  115. System.out.println(stu);
  116. }
  117. }
  118.  
  119. /**
  120. * 测试环境:
  121. * 缓存中有两条数据
  122. * 结果:
  123. * 01.get肯定产生sql
  124. * 02.iterate遍历的时候 先去缓存中获取已经存在的数据! 就会减少2次查询!
  125. */
  126. @Test
  127. public void testIterator21(){
  128. //获取id为1的student对象
  129. Student student1= (Student) session.get(Student.class, 1); // 产生1条
  130. Student student2 = (Student) session.get(Student.class, 2); // 产生1条
  131. System.out.println("*************************");
  132. String hql="from Student";
  133. Query query = session.createQuery(hql);
  134. Iterator<Student> iterate = query.iterate(); // 产生1条
  135. while (iterate.hasNext()) {
  136. Student stu = iterate.next();// 产生4条
  137. System.out.println(stu);
  138. }
  139.  
  140. }
  141.  
  142. /**
  143. *iterate在没有缓存的情况下 会执行N+1条数据!
  144. *N:指的是数据数量!
  145. *1:查询所有的ID!
  146. */
  147. @Test
  148. public void testIterator3(){
  149. String hql="from Student";
  150. Query query = session.createQuery(hql);
  151. Iterator<Student> iterate = query.iterate();
  152. while (iterate.hasNext()) {
  153. Student stu = iterate.next();
  154. System.out.println(stu);
  155. }
  156. System.out.println("********************");
  157. //再次查询 清空缓存
  158. session.clear();
  159. iterate = query.iterate();
  160. while (iterate.hasNext()) {
  161. Student stu = iterate.next();
  162. System.out.println(stu);
  163. }
  164. }
  165.  
  166. }
  1. /**
  2.  
  3. Query接口中的list()和iterate()都可以执行查询操作,
    而iterate()能够利用延迟加载和缓存的机制提高查询性能!iterate()查询时,
    仅查询ID字段以节省资源。需要使用数据时,再根据ID字段到缓存中检索匹配的实例!
    如果存在就直接使用!只有当缓存中没有需要的数据时,iterate()才会执行select语句
    !根据ID字段到数据库中查询!iterate()更适用于查询对象开启二级缓存的情况!
  4. */
  5.  
  6. 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. MediaInfo代码阅读

      MediaInfo是一个用来分析媒体文件的开源工具. 支持的文件非常全面,基本上支持所有的媒体文件. 最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理. 从Meid ...

  2. iOS:基于RTMP的视频推流

    iOS基于RTMP的视频推流 一.基本介绍 iOS直播一出世,立马火热的不行,各种直播平台如雨后春笋,正因为如此,也同样带动了直播的技术快速发展,在IT界精通直播技术的猴子可是很值钱的.直播技术涉及的 ...

  3. hive sql 常见异常

    1.union Logging initialized using configuration in file:/home/xiaoju/hadoop/apache-hive-1.2.1-bin/co ...

  4. 【前端酷站】分享一个纯 Javascript 的图表库与立体像素风制作~

    今天小编为大家推荐一个神奇的酷站.ECharts,一个纯 Javascript 的图表库. 以下是各个几个不错的界面的介绍: 首页:http://echarts.baidu.com/ 在首页有完整的说 ...

  5. Redis具体解释

    redis 学习指南 一.介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.一个高性能的key-value数据库.并提供多种语言的API.说到Key-Val ...

  6. chrome浏览器美化插件:让您的浏览器页面冒水泡, 游小鱼儿

    下载插件和效果图 这是一个让你的浏览器冒泡泡的插件, 浏览网页的时候仿佛置身于海底世界: 插件下载地址:http://files.cnblogs.com/files/diligenceday/chro ...

  7. Win10远程桌面提示你的凭据不工作的处理方法

    需要确保在组策略编辑器(Win+R 输入 gpedit.msc )中计算机配置->Windows设置->安全设置->本地策略->安全选项->右侧的网络访问:本地帐户的共享 ...

  8. 阿里云物联网平台体验(树莓派+Python篇)

    阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作.但是同时也见证了 ...

  9. 只有设置了 name 属性的表单元素才能在提交表单时传递它们的值

    $(function () { var wait = $("<img src=\"\" alt=\"正在上传\"/>"); $( ...

  10. CentOS 7.4nginx配置SSL

    一.在/etc/nginx/conf.d目录下创建虚拟主机配置文件 server { listen 80; server_name www.xx.com xx.com; return 301 http ...