Hibernate的核心接口:Configuration、SessionFactory、Session、Transaction通过这些对象不仅可以对持久化对象进行存取,还能够进行事务控制;
1.Configuration接口(作用:加载核心配置文件)
①使用xml配置核心文件
Configuration cfg = new Configuration.configure();
Hibernate会自动在目录下搜索hibernate.cfg.xml文件,并将其读取到内存中作为后续操作的基础配置;
注意:如果在hibernate中没有配置映射文件,需要手动加载
cfg.addResource("映射文件的全路径");
②使用属性文件配置核心文件
Configuration cfg = new Configuration();
注意:属性文件不能直接引入映射文件,必须手动加载
cfg.addResource("映射文件的全路径");
2.SessionFactory接口(作用:充当数据存储源代理,并负责创建Session对象)
注意:SessionFactory并不是轻量级的,一个应用通常只需要一个SessionFactory;当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory
类似于连接池的作用
工具类:
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();
}
}
3.Session接口(作用:session代表的是hibernate与数据库的连接对象,不是线程安全的。与数据库交互的桥梁)
Session是hibernate持久化操作的基础,提供了众多持久化对象的CRUD操作;
①保存数据:Serializable save(Object obj);
实例:
public class HibernateDemo2 {
@Test
public void demo1(){
Session session = HibernateUtils.openSession();
//4.手动开启事务
Transaction transaction = session.beginTransaction();
//5.编写代码,创建对象
Customer customer = new Customer();
customer.setCust_name("王东东");
//保存对象
session.save(customer);
//6.事务提交
transaction.commit();
//7.资源释放
session.close();
}
}
②查询数据的方法有两种,分别为
1. T get(Class c,Serializable id);
2. T load(Class c,Serializable id);
get方法的和load方法的区别:
1.get方法是立即查询,执行到该方法的时候会马上发送sql语句查询;
get方法查询返回的对象是真实对象;
get方法查询如果没有查询到数据会返回null
2.load方法是延迟查询(lazy加载),不会马上发送sql语句,而是当需要使用这个对象的时候才会发送sql语句
load方法返回的是代理对象
load方法没有查询到数据的时候,会报objectnotfoundexception错误;
实例:
@Test
public void demo2(){
Session session = HibernateUtils.openSession();
//4.手动开启事务
Transaction transaction = session.beginTransaction();
//5.get方法
Customer customer = session.get(Customer.class, 2L);
System.out.println(customer);
//5.load方法
Customer customer2 = session.load(Customer.class, 3L);
System.out.println(customer2);
//6.事务提交
transaction.commit();
//7.资源释放
session.close();
}
在debug模式下,在查询和输出设置两个端点,可以看出;
3.删除数据:void delete(Object obj);
实例:
@Test
public void demo3(){
Session session = HibernateUtils.openSession();
//4.手动开启事务
Transaction transaction = session.beginTransaction();
//5.先查询再删除(使数据存入一级缓存,再删除,事务提交后会根据快照进行更新)
Customer customer = session.get(Customer.class, 2L);
session.delete(customer);
//6.事务提交
transaction.commit();
//7.资源释放
session.close();
}
4.更新数据:void update(Object obj);
实例:
public void demo4(){
Session session = HibernateUtils.openSession();
//4.手动开启事务
Transaction transaction = session.beginTransaction();
//5.先查询再修改(使数据存入一级缓存,再修改,事务提交后会根据快照进行更新)
Customer customer = session.get(Customer.class, 3L);
customer.setCust_name("小黑");
session.update(customer);
//6.事务提交
transaction.commit();
//7.资源释放
session.close();
}
5.保存或更新:void saveOrUpdate(Object obj)
如果对应的数据存在则更新,没有则保存
实例
public void demo5(){
Session session = HibernateUtils.openSession();
//4.手动开启事务
Transaction transaction = session.beginTransaction();
//5.创建对象,保存后如果对象的唯一标识和表中的主键对应,则更新数据;没有对应的则保存对象
Customer customer = new Customer();
customer.setCust_id(1L);
customer.setCust_name("小白");
session.saveOrUpdate(customer);
//6.事务提交
transaction.commit();
//7.资源释放
session.close();
}
4.Transaction接口:事务对象
在事务的开启后,对事务的提交或回滚
事务对象通过session创建
Transaction transaction = session.beginTransaction();
事务提交
transaction.commit();
事务回滚
transaction.rollback();