一、Configuration:Hibernate的配置对象
- 加载核心配置文件
- hibernate.properties
Configuration cfg = new Configuration();
- hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
- 加载映射文件【当在核心配置文件中未引入映射文件】
//手动加载映射
cfg.addSource("XXX");
二、SessionFactory:Session工厂
SessionFactory接口负责初始化Hibernate。它充当数据存储源(数据库连接池)的代理,并负责创建Session对象。
- SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存(不用了);
- SessionFactory对象是线程安全的;
- 一个项目创建一个SessionFactory对象即可。-------
抽取工具类
代码如下:
package com.hibernate.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
public static final Configuration cfg;
public static final SessionFactory sf;
static {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
}
public static Session openSession() {
return sf.openSession();
}
}
我们对上面的工具类进行一个测试【仍然是保存客户】:
public class HibernateDemo2 {
@Test
public void Demo1() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
Customer customer = new Customer();
customer.setCust_name("王小东");
tx.commit();
session.close();
}
}
客户“王小东”保存成功:
三、Session:类似Connection对象【连接对象】
- Session是Hibernate与数据库的连接对象,是与数据库交互的桥梁(CRUD)。
- Session对象是非线程安全的,因此不能定义为全局的。
- Hibernate的session不同于JSP应用中的HTTPSession。这里当使用session这个术语时,指的是Hibernate中的session,而会将HTTPSession对象称为用户session。
Session的API
- 保存:
Serializable save(Object obj);
- 查询:
A.T get(Class c, Serializeable id);
B.T load(Class c, Serializeable id);
C. get方法和load方法的区别?(断点调试)【重点
】
/**
* get方法:
* 1. 采用的是立即加载,执行到这行代码的时候,就会马上发送SQL语句去查询。
* 2. 查询后返回的是真实对象本身。
* 3. 查询一个找不到的对象的时候,返回null。
*
* load方法:
* 1. 采用的是延迟加载(lazy懒加载),执行到这行代码的时候,不会发送SQL语句,
* 当真正使用这个对象时才会发送SQL语句。
* 2. 查询后返回的是代理对象。利用javassist技术产生的代理【javassist-3.18.1-GA.jar】
* 3. 查询一个找不到的对象的时候,返回OBjectNotFoundException。
*/
- 修改:
void update(Object obj);
public void Demo3() {
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
/*
//方法1:直接创建对象,进行修改(×)
Customer customer = new Customer();
customer.setCust_id(1l);
customer.setCust_name("XXX");
session.update(customer);//这样会将cust_id 为 1的对象的其他属性值置为null
*/
//方法2:先查询,再修改(推荐)
Customer customer = session.get(Customer.class, 1l);
customer.setCust_name("XXX");
session.update(customer);
tx.commit();
session.close();
}
- 删除:
void delete(Object obj);
- 保存或更新:
void saveOrUpdate(Object obj);
四、Transaction:事务对象
Hibernate 中管理事务的对象。
- commit(); 提交事务
- rollback();事务回滚