hibernate对jdbc API进行了封装,提供了更加面向对象的API。
public static void main(String[] args) throws Exception
{
//1.实例化Configuration
Configuration conf = new Configuration().configure();
//2.实例化SessionFactory
SessionFactory sf = conf.buildSessionFactory();
//3.实例化Session
Session sess = sf.openSession();
//4.开始事务
Transaction tx = sess.beginTransaction();
//5.创建消息实例
News n = new News();
//6.设置消息标题和消息内容
n.setTitle("疯狂Java联盟成立了");
n.setContent("疯狂Java联盟成立了,网址是www.crazyit.org");
//7.保存消息
sess.save(n);
//8.提交事务
tx.commit();
//9.关闭Session
sess.close();
}
1.Configuration接口:
用于配置并启动hibernate。
Configuration类的主要作用是解析Hibernate的配置文件和持久化映射文件中的信息,然后通过Configuration对象的buildSessionFactory()方法创建SessionFactory对象,所以Configuration对象一般只有在获取SessionFactory对象时需要使用。当获取了SessionFactory对象之后,由于配置信息已经由Hibernate 维护并绑定在返回的SessionFactory中,因此该Configuration已无使用价值。
我们可以查看Configuration的源代码,它的configure()方法是这样实现的:
public Configuration configure() throwsHibernateException {
configure("/hibernate.cfg.xml" );//此处指定了ORM文件的位置
return this;
}
我们看到它是在这里指定了ORM文件的位置,这就是为什么Hibernate总是默认到classpath下去寻找hibernate.cfg.xml文件的原因了。实际上我们还可以通过configure(String resource)来动态的指定配置文件,只不过通常我们都是采用的默认设置罢了。这样的话我们的配置文件就都被读取了,同时配置文件中通过元素引入的映射文件也被读取了。
2.SessionFactory接口:
SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory**并不是轻量级**的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
SessionFactory有以下特点:
- 它是线程安全的,这意味着它的同一个实例可以被应用的多个线程共享。
- 它是重量级的,这意味着不能随意创建或销毁它的实例。如果应用中只访问一个数据库,只需要创建一个SessionFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每一个数据库创建一个单独的SessionFactory实例。
- 之所以称SessionFactory是重量级的,是因为它需要一个很大的缓存,用来存放预定义的sql语句及映射元数据等。用户还可以为SessionFactory配置一个缓存插件,这个缓存插件被称为Hibernate的第二级缓存,该缓存用来存放被工作单元读过的数据,将来其他工作单元可能会重用这些数据,因此这个缓存中的数据能够被所有工作单元共享。一个工作单元通常对应一个数据库事务。
这个实例中有一个getCurrentSession()方法获得一个session。在老的api中我们也会用openSession方法获取session,这种方法现在不提倡再用了,因为他永远只会产生一个新的session,并且他需要你手动将其close掉,而getCurrentSession()方法在你这个session还没有提交之前你无论拿多少次,他始终都是同一个session,session一旦提交那再拿就是一个新的session了,也就是他首先会在上下文中去找session,如果没有找到就会新建一个新的session,并且他在提交完事务后自动close掉。
3.Session接口:
对于Hibernate开发人员来说是一个最重要的接口,被称为持久化管理器,提供了持久化的相关操作:保存、更新、删除、加载对象。Hibernate操作数据库之前必须先获取一个Session对象,相当于JDBC在操作数据库之前必须获取一个Connection对象一样。
获取Session对象后,Hibernate内部并不会获取操作数据库的java.sql.Connection对象,而是等待Session对象真正需要对数据库进行CRUD等操作时,才会从数据库连接池中获取java.sql.Connection对象。而关闭Session对象时,则是将java.sql.Connection对象返回到连接池中,而不是直接关闭java.sql.Connection对象。
Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象。 session可以看作介于数据连接与事务管理一种中间接口。
4.Transaction接口:
Hibernate数据库事物接口。Transaction接口负责事务相关的操作,一般在Hibernate的增删改中出现,但是使用Hibernate的人一般使用Spring去管理事务。
5. Query接口:
是Hibernate的查询接口,用于向数据库查询对象以及控制执行查询的过程。Query实例包装了一个HQL(Hibernate Query Language)查询语句。HQL查询语句与SQL相似,HQL面向对象,引用类名和类的属性名,而不是表名和字段名。