Hibernate通过配置文件构建org.hibernate.Session对象的方式
  1、创建 org.hibernate.cfg.Configuration对象configuration;

2、调用configuration对象的configure(path)方法加载配置文件,参数为Hibernate核心配置文件hibernate.cfg.xml的位置路径;

  3、调用加载过配置文件的configuration对象的buildSessionFactory()方法获取org.hibernate.SessonFactory对象sessionFactory;

  4、一般情况下调用sessionFactory对象的openSession()方法获取org.hibernate.Session对象session(特殊情况如本例所示通过ThreadLocal管理session,避免session频繁创建与销毁);
 
 ——————到此,session构建成功,具体使用时还有如下步骤:

  5、涉及事务管理时,调用session的beginTransaction()方法获取org.hibernate.Transaction对象transaction;

  6、进行具体的数据库增删改查操作;

  7、进行事务管理操作,如提交事务transaction.commit();

  8、关闭session,session.close();


HibernateSessionFactory类代码(带详细注释):

<span style="font-size:14px;">import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

/*
 * Hibernate通过配置文件构建org.hibernate.Session对象的方式
 *	1、创建 org.hibernate.cfg.Configuration对象configuration;
 *	2、调用configuration对象的configure(path)方法加载配置文件,参数为Hibernate核心配置文件hibernate.cfg.xml的位置路径;
 *	3、调用加载过配置文件的configuration对象的buildSessionFactory()方法获取org.hibernate.SessonFactory对象sessionFactory;
 *	4、一般情况下调用sessionFactory对象的openSession()方法获取org.hibernate.Session对象session(特殊情况如本例所示通过ThreadLocal管理session,避免sess<span style="white-space:pre">		</span>ion频繁创建与销毁);
 *
 *	——————到此,session构建成功,具体使用时还有如下步骤:
 *	5、涉及事务管理时,调用session的beginTransaction()方法获取org.hibernate.Transaction对象transaction;
 *	6、进行具体的数据库增删改查操作;
 *	7、进行事务管理操作,如提交事务transaction.commit();
 *	8、关闭session,session.close();
 */
public class HibernateSessionFactory {
	//配置文件位置(相对路径)
	private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";					
	//使用线程局部变量TreadLocal管理session,它为每一个线程提供一个session对象的副本
	//可以结合过滤器实现保持登录状态,结合监听器实现session状态变化与session值的更新
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();	
	//用于加载配置文件
	private  static Configuration configuration = new Configuration();
	//声明Hibernate的session工厂类对象
	private static org.hibernate.SessionFactory sessionFactory;
	private static String configFile = CONFIG_FILE_LOCATION;
	//静态块,类加载时执行
	static {
		try {
			//加载配置文件
			configuration.configure(configFile);	
			//创建Hibernate的session工厂对象
			sessionFactory = configuration.buildSessionFactory();		
		} catch (Exception e) {
			//输出错误信息
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}
	private HibernateSessionFactory() {
	}
	//定义获取session对象的方法(通过ThreadLoacl)
	public static Session getSession() throws HibernateException {
		//通过threadLocal的get方法获取当前线程的session对象
		Session session = (Session) threadLocal.get();	
		//判断session状态
		if (session == null || !session.isOpen()) {			
			if (sessionFactory == null) {	
				//重建sessonFactory
				rebuildSessionFactory();
			}
			//通过openSession方法获取session对象										
			session = (sessionFactory != null) ? sessionFactory.openSession(): null;
			//将session交由threadLocal管理
			threadLocal.set(session);						
		}
		return session;
	}
	
	//定义sessionfactory的重建方法
	public static void rebuildSessionFactory() {
		try {
			//再次加载配置文件
			configuration.configure(configFile);
			//再次创建sessionFactory对象
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			//输出错误信息
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}
	
	//定义session关闭的方法
	public static void closeSession() throws HibernateException {
		//通过threadLocal的get方法获取当前线程的session对象
		Session session = (Session) threadLocal.get();
		//将threadLocal置空
		threadLocal.set(null);
		if (session != null) {
			//关闭session
			session.close();
		}
	}
	
	//get/set方法
	public static org.hibernate.SessionFactory getSessionFactory() {
		return sessionFactory;
	}
	public static void setConfigFile(String configFile) {
		HibernateSessionFactory.configFile = configFile;
		sessionFactory = null;
	}
	public static Configuration getConfiguration() {
		return configuration;
	}
}</span>


在dao层使用方法,student表的一些操作,如下所示:

import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.sanqing.hibernate.HibernateSessionFactory;
import com.sanqing.po.Student;
import com.sanqing.po.Subject;

public class StudentDAOImpl implements StudentDAO{
	public Student findByStudentID(String studentID) {
		Session session = HibernateSessionFactory.getSession();
		Student student = (Student) session.get(Student.class, studentID);
		HibernateSessionFactory.closeSession();
		return student;
	}

	public void updateStudent(Student student) {
		Session session = HibernateSessionFactory.getSession();
		Transaction  transaction = null;
		try{
			transaction = session.beginTransaction();
			session.update(student);
			transaction.commit();
		}catch(Exception ex) {
			ex.printStackTrace();
			transaction.rollback();
		}
		HibernateSessionFactory.closeSession();
	}

	public List<Student> findByStudentName(String studentName) {
		Session session = HibernateSessionFactory.getSession();
		Query query = session.createQuery("from Student as stu where stu.studentName = ?");
		query.setString(0, studentName);
		List list = query.list();					
		HibernateSessionFactory.closeSession();		
		return list;
	}

	public List<Student> findByStudentClass(String sclass) {
		Session session = HibernateSessionFactory.getSession();
		Query query = session.createQuery("from Student as stu where stu.sclass = ?");
		query.setString(0, sclass);
		List list = query.list();					
		HibernateSessionFactory.closeSession();		
		return list;
	}
}

如果想深入学习SSH框架,可以先参看一个demo:一个典型的SSH登录与增删改查demo详解+源代码


本文转载:CSDN博客