上一讲的入门案例,我们使用了Hibernate框架的添加功能,此处不再赘述。这一讲我们继续介绍Hibernate的查询、更新、删除操作。
准备工作:实体类、数据库准备同上一讲入门案例
1、查询
1.1:按照主键进行查询
对于这种情况,Hibernate提供了两个方法:get()、load()
修改实体类,添加toString()方法:
package com.js.demo2;
public class Customer {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}
修改测试类:添加一个测试方法(get()方法)
@Test
//按照id来进行查询
public void demo2(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Customer customer=(Customer)session.get(Customer.class, 1);
System.out.println(customer);
tx.commit();
session.close();
sessionFactory.close();
}
运行测试:
修改测试类:添加一个测试方法(load()方法)
public void demo3(){
Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
Customer customer=(Customer)session.load(Customer.class, 1);
System.out.println(customer);
tx.commit();
session.close();
sessionFactory.close();
}
运行测试:
看查询结果,好像看不出get()、load()二者有什么区别。
*****get 和load的区别:(面试题)
* 1.发送SQL的时机:
* load这个方法采用了一个技术.lazy延迟加载(懒加载).真正使用这个对象的数据的时候.(对象的数据不包括主键).
* get这个方法是立即检索.当执行session.get()方法的时候,马上发送SQL语句查询.
* 2.返回的对象:
* load方法返回的是代理对象.
* get方法返回的是真实的对象.
* 3.查询一个不存在的数据:
* load方法抛异常:ObjectNotFoundException.
* get方法抛异常:NullPointException.