Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。
一、Configuration类
1.1 主要作用
Configuration对象用于配置并且启动Hibernate。
Hibernate应用通过该对象来获得对象-关系映射文件中的元数据,以及动态配置Hibernate的属性,然后创建SessionFactory对象。
简单一句话:加载Hibernate的配置文件,可以获取SessionFactory对象。
1.2 其他应用
加载配置文件的种类,Hibernate支持xml和properties类型的配置文件,在开发中基本都使用XML配置文件的方式。
如果采用的是properties的配置文件,那么通过Configuration configuration = new Configuration();就可以假装配置文件,但是需要自己手动加载映射文件。
例如:config.addResource("cn/itcast/domain/Student.hbm.xml");
此外,如果采用的XML的配置文件,通过Configuration configuration = new Configuration().configure();加载配置文件。这叫做方法链编程。
二、SessionFactory
SessionFactory是数据库编译后的内存镜像,通常一个应用对应一个SessionFactory对象。SessionFactory由Configuration对象生成,Configuration对象负责加载hibernate配置文件。
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
SessionFactory并不是轻量级的,意味着它的创建和销毁是需要消耗一些资源的,我们不要随意的去创建和销毁它。
在web项目中,当服务器启动的时候就把它创建好,Spring做这件事情。
是工厂类,是生成Session对象的工厂类
SessionFactory类的特点
由Configuration通过加载配置文件创建该对象。
SessionFactory对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。
* 预定义SQL语句
* 使用Configuration类创建了SessionFactory对象时,已经在SessionFacotry对象中缓存了一些SQL语句
* 常见的SQL语句是增删改查(通过主键来查询)
* 这样做的目的是效率更高
* 一个SessionFactory实例对应一个数据库,应用从该对象中获得Session实例。
* SessionFactory是线程安全的,意味着它的一个实例可以被应用的多个线程共享。
* SessionFactory是重量级的,意味着不能随意创建或销毁它的实例。如果只访问一个数据库,只需要创建一个SessionFactory实例,且在应用初始化的时候完成。
* SessionFactory需要一个较大的缓存,用来存放预定义的SQL语句及实体的映射信息。另外可以配置一个缓存插件,这个插件被称之为Hibernate的二级缓存,被多线程所共享。
* 一般应用使用一个SessionFactory,最好是应用启动时就完成初始化。
注意:我们引入了映射配置文件。那么,这个对象的简单的crud sql语句都缓存在了SessionFactory对象中。为什么要缓存呢?为了效率。如果不缓存,那么每次crud都要生成一条sql,很慢的。
每次要操作数据库的时候,SessionFactory就创建一个session,会话完成之后,session就会销毁。所以,session的生命周期是很短暂的。session提供了缓存。但是,如果,销毁之后,还想要把一些对象缓存,那么就把这个对象放到SessionFactory中(二级缓存)。因为SessionFactory活得比较久。由于许多session都共享SessionFactory,所以,SessionFactory有策略保证SessionFactory是线程安全的。
由于我们不要轻易的创建和销毁SessionFactory,那么我们可以对hibernate入门案例(一)的程序进行一些修改。
创建一个工具类HibernateUtils
package com.hib.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
* hibernate框架的工具类
*
*/
public class HibernateUtils {
private static final Configuration CONFIG;
private static final SessionFactory FACTORY;
// 静态代码块,类在加载的时候就会执行
static {
// 加载xml的配置文件
CONFIG = new Configuration().configure();
// 构造工厂
FACTORY = CONFIG.buildSessionFactory();
}
public static Session getSession() {
return FACTORY.openSession();
}
}
测试代码:
@Test
public void testSave2() {
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("李四");
user.setAge(34);
session.save(user);
// 提交事务
tx.commit();
// 释放资源
session.close();
//注意:工厂就不要随意关闭了
}