为工程创建了Hibernate环境之后,就可以通过Hihbernate API来操作数据库。Hibernate内部也是采用JDBC来访问数据库的。如下图就是JDBC API及Hibernate API方式来访问数据库:
使用Hibernate操作数据库包括7个步骤:
(1)读取并解析配置文件
Configuration configuration = new Configuration().configure();
根据默认位置的Hibernate配置文件的配置信息,构建Configuration对象
Configuration负责管理Hibernate的配置信息。
(2)读取并解析映射信息,创建SessionFacory对象:
SessionFactory sessionFactory = configuration.buildSessionFactory();
SessionFactory负责创建Session对象。
Configuration会根据当前的数据库配置信息,构造SessionFactory对象
SessionFactory对象一旦构造完毕,则Configuration对象的任何变更将不会影响已创建的SessionFactory对象。
如果Hibernate配置信息有所改动,那么需要基于改动后的Configuration对象重新构建一个SessionFactory对象。
(3)打开Session:
Session session = sessionFactory.openSession(); // 或者使用 sessionFactory.getCurrentSession();
Session是Hibernate持久化操作的基础。Session负责完成对象的持久化操作,它相当于JDBC中的Connection。
Session作为贯穿Hibernate的持久化管理器的核心,提供了众多持久化操作,如save()、delete()、update()、get()、load()等。
通过这些方法,即可透明地完成对象的增删改查(crud)的操作。
(4)开始一个事物(增删改操作必须,查询操作可选):
Transaction transaction = session.beginTransaction(); // 打开事务
(5)数据库操作:
session.save(obj); //将obj对象进行保存操作
(6)结束事物:
transaction.commit(); //提交事务
(7)关闭session:
session.close(); //关闭session
如果在hibernate配置文件中,参数current_session_context_class设置为thread,并采用SessionFactory的getCurrentSession()方法获得Session对象,则不需要执行session.close()方法。
资料:
在项目开发过程中,通常使用工具类来管理SessionFactory和Session,代码如图所示:
package com.geeksss.HibernateStudy.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
// 初始化一个ThreadLocal对象,ThreadLocal对象有get()、set()方法
private static final ThreadLocal sessionTL = new ThreadLocal();
private static Configuration configuration;
private static final SessionFactory sessionFactory;
static{
try{
configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
}catch(Throwable ex){
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}
public static Session currentSession(){
/*
* sessionTL的get()方法根据当前县城返回其对应的线程内部变量,即Session对象。
* 多线程情况下共享数据库连接是不安全的。
* ThreadLoca保证了每个线程都有自己独立的Session对象。
*/
Session session = (Session)sessionTL.get();
/*
* 如果session为null,则打开一个新的session
* 如果该线程是初次访问,session是null,则创建一个Session对象
*/
if(session==null){
session = sessionFactory.openSession(); // 创建一个Session对象
sessionTL.set(session); // 保存该Session对象到ThreadLocal中
}
return session; // 如果当前线程已经访问过数据库,则从sessionTL中get()就可以获取该线程上次获取过的Session对象。
}
/**
* 关闭session
* 首先调用sessionTL.get()方法获取Session对象;
* 接着调用sessionTL.set(null)方法,把sessionTL管理的Session对象置为null;
* 最后关闭Session。
*/
public static void closeSession(){
Session session = (Session)sessionTL.get();
sessionTL.set(null);
session.close();
}
}
HibernateUtil.java (Hibernate工具类)