看下面例子,就很快明白了
连续查询两次
public void testLoad(){
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);
System.out.println("1.student Name:"+s.getName());
Student s1 = (Student)session.load(Student.class, 1);
System.out.println("2.student Name:"+s1.getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 代码分析
- 只执行一次sql语句:第一次load查询后放于缓存,第二次load查询会先看下缓存有没有,如果有的话,从缓存中获取数据
先添加,再查询
public void testAdd2(){
Student s1 = new Student();
s1.setName("Jack");
s1.setScore(90);
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(s1);
Student s2 = (Student)session.load(Student.class, 2);
System.out.println("2.student Name:"+s2.getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 代码分析:
- 只执行一条添加sql语句:save的时候先往缓存session里放(此时没有id),然后再往数据库里插入数据,再把id放到session里。然后查询的时候先查看缓存里有没有id为2的数据,如果有就直接获取
先查询,然后关闭session,再查询:
public void testLoad2(){
Session session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);
System.out.println("1.student Name:"+s.getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
session =null;
try{
session = HibernateUtil.getSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 1);
System.out.println("1.student Name:"+s.getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtil.closeSession(session);
}
}
- 代码分析:
- 执行两条sql语句,session关闭后,缓存数据也没有了,需要再到数据库查询。这就是一级缓存