CRUD
由于加载配置文件等都是一样的,所以提取工具类
public class HibernateUtils {
public static final Configuration configuration;
public static final SessionFactory sessionFactory;
static{
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
}
public static Session openSession(){
return sessionFactory.openSession();
}
}
查询:
//查询
public void demo1(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
/**
* get方法:
* 1.采用的立即加载,执行到这行代码时立马发送sql语句去查询
* 2.返回真实对象本身
* 3.查询找不到对象时,返回null;
* load方法:
* 1.采用延迟加载(懒加载),执行这行代码时不加载,真正使用时才加载
* 2.返回代理的对象,javassist-3.18.1-GA.jar利用javassist技术产生的代理
* 3.查询找不到对象时,返回ObjectNotFoundException
*/
//使用get方法进行查询
Customer customer = session.get(Customer.class, 2l);//Customer的id是long类型,所以这里加l
//使用load方法查询
// Customer customer = session.load(Customer.class, 2l);//l是long类型
// System.out.println(customer);
//事务提交
transaction.commit();
session.close();
}
修改:
public void demo2(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//直接创建对象,进行修改
// Customer customer = new Customer();
// customer.setCust_id(3l);
// customer.setCust_name("cnm");
// session.update(customer);
//先查询再修改
Customer customer = session.get(Customer.class,3l);
customer.setCust_name("mnc");
session.update(customer);
transaction.commit();
session.close();
}
删除:
public void demo3(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//直接创建再删除
// Customer customer = new Customer();
// customer.setCust_id(3l);
// session.delete(customer);
//先查询再删除
Customer customer = session.get(Customer.class, 3l);
session.delete(customer);
transaction.commit();
session.close();
}
增加:
public void demo4() {
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("123");
session.save(customer);
transaction.commit();
session.close();
}
查询所有:
public void demo5(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//接受HQL:Hibernate Query Language 面向对象查询语言
// Query query = session.createQuery(" from Customeer");
// List<Customer> list = query.list();
// for (Customer customer : list) {
// System.out.println(customer);
// }
//接受SQL
SQLQuery query = session.createSQLQuery("select * from cst_customer");
List<Object []> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
}
transaction.commit();
session.close();
}
持久化对象
- Hibernate的持久化类的编写规则
- 无参数构造
- 属性私有
- 属性尽量使用包装类
- 提供一个唯一OID与主键对应
- 不要使用final修饰
hibernate中持久化对象的三种状态:
public void demo(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer = new Customer();//瞬时态对象,没有唯一标识id,没有被session管理
customer.setCust_name("zhangsan");
Serializable id = session.save(customer);//持久态,被session管理有唯一标识oid
System.out.println(customer);
transaction.commit();
session.close(); //session关闭,这之后没有被session管理,属于托管态
}
可以根据三种状态的条件进行相互转化。
瞬时态对象:
获得:通过new得到的对象
瞬时转持久:
session.save(Object obj)或session.saveOrUpdate(Object obj)
瞬时转托管:
给这个对象设置唯一标识id
持久态对象:
获得:session的get(),load(),find(),iterate()
持久转瞬时:
session.delete()
持久转托管:
session的close(),clear(),evicr(Object obj)
托管态对象:
获得: new一个对象后设置唯一标识id
托管转持久:
session的update(),saveOrUpdate()
托管转瞬时:
设置唯一标识id为null
一级缓存
一级缓存就是指Session缓存,在Session中定义了一系列的集合来存储数据,它们构成了Session的缓存。只要Session没有关闭,它就会一直存在。当使用save()、get()、update()等进行操作时,就会将持久化对象保存到Session中,当下一次再去查询缓存中具有的对象(通过OID值来判断),就不会去从数据库中查询了,而是直接从缓存中获取。Hibernate的一级缓存存在的目的就是为了减少对数据库的访问。 是一种优化策略。(二级缓存为SessionFactory缓存,用redis后不考虑)
public void demo(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
Customer customer1 = new Customer();//发送sql语句
customer1.setCust_name("cnm");
Serializable id = session.save(customer1);
Customer customer2 = session.get(Customer.class,id);//不发送sql语句
System.out.println(customer2.toString());
transaction.commit();
session.close();
}
一级缓存常用的API:
clear()
:清空一级缓存。evict()
:清空一级缓存中指定的某个对象。refresh()
:重新查询数据库,用数据库中的信息来更新一级缓存与快照区。