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>
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详解+源代码