Query接口中list()与iterator()查询的区别

来源:互联网 发布:蜂鸟众包提现网络出错 编辑:程序博客网 时间:2024/05/22 15:07
/**
* list查询和iterator查询的区别
* 1、list查询
* (1)Query接口中定义的方法
* (2)一次查询所有数据
* 2、iterator查询
* (1)Query接口中定义的方法
* (2)先查询满足条件数据的id,再根据每一个id,进行主键进行查询,有多少条数据就查询多少次
* 即一共查询N+1次(N代表中记录数)
* (3)迭代数据时,如果用到了数据,才会去查询数据库(懒加载),没有用到数据,则不会去查询
* 3、区别
* (1)查询的方式不同,list一次查询全部,iterator查询N+1次
* (2)一级缓存
* list查询会放入到缓存,但不会从缓存中取数据
* iterator查询会放入到缓存,但每次查询前会先检查缓存中是否有数据,有则从缓存中取,没有则去查询数据库
*
* Created by 14249 on 2017/2/22.
*/
public classList_Iterator_Demo {
staticSessionFactorysessionFactory=null;
static{
sessionFactory=newConfiguration()
.configure()
.buildSessionFactory();
}
/*-----------list()方法-----------*/
@Test
public void testList(){
Session session=sessionFactory.openSession();
session.beginTransaction();
/*HQL查询*/
Query query=session.createQuery("from Student ");
/*执行第一次查询*/
List<Student> list= query.list();//查询了数据库
for(Student stu:list){
System.out.println(stu.toString());
}
/*执行第二次查询*/
List<Student> list2 = query.list();//查询了数据库,没有缓存中取
for(Student stu:list2) {
System.out.println(stu.toString());
}
session.getTransaction().commit();
}
/*-----------iterator()方法-----------
* 使用iterator查询的时候,发送向数据库SQL语句的次数是(总记录数+1)
* 查询的对象会放入到缓存中
* */
@Test
public void testIterator(){
Session session=sessionFactory.openSession();
session.beginTransaction();

Query query=session.createQuery("from Student");
//query.uniqueResult();
Iterator<Student> iterate = query.iterate();//查询的时候先从缓存找,没有数据,就查询数据库
//有数据,就从缓存中取
while(iterate.hasNext()){
Student stu=iterate.next();
System.out.println(stu.toString());
}
/*-------------------------------------------------------*/
System.out.println("==================================");
Iterator<Student> iterate2 = query.iterate();
while(iterate2.hasNext()){
Student stu=iterate2.next();
System.out.println(stu.toString());
}

session.getTransaction().commit();
}
/*list查询与iterator查询的区别------------------------
* list查询的对象是否放入到了缓存中?
* 思路:1、先执行一次list查询
* 2、再执行一次iterator查询(iterator查询会先从缓存中找数据)
* 3、如果iterator查询没有从数据库中取,则说明list查询的对象放入到了缓存中,反之,则没有放入缓存
* */
@Test
public void test_list_iterator(){
Session session =sessionFactory.openSession();
session.beginTransaction();

Query query=session.createQuery("from Student ");
/*执行list查询*/
List<Student> list=query.list();//根据结果,说明list查询出来的对象放到了缓存中
for(Student stu:list){
System.out.println(stu.toString());
}
System.out.println("===============================================");
/*执行iteartor查询*/
Iterator<Student> iterate2 = query.iterate();//只执行了一次id查询,查询所有的id
while(iterate2.hasNext()){
Student stu=iterate2.next();
System.out.println(stu.toString());//控制台显示并没有向数据库发送查询语句,则说明是从缓存中取的数据
}

session.getTransaction().commit();
}

}
0 0
原创粉丝点击