SessionFactory 接口负责Hibernate的初始化和建立Session对象。它在Hibernate中启到一个缓冲区的作用,hibernate可以将自动生成的SQL 语句、映射数据以及某些可重复利用的数据放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。
SessionFactory具有以下特点:
(1)它是线程安全的,它的同一实例能够供多个线程共享。
(2它是重量级的,不能随意的创建和销毁它的实例。
由于SessionFactory的这些特点,一般情况下,一个项目只需要一个SessionFactory,只有当应用中存在多个数据源时,才为每个数据源建立一个SessionFactory实例。因此,在实际项目使用中,通常会抽取一个HibernateUtils的工具类,用来提供SessionFactory对象。
代码如下:
package cn.Unit;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
//声明一个私有的静态 final 类型的 Configuration 对象
private static final Configuration config;
//声明一个私有的静态 final 类型的 SessionFactory 对象
private static final SessionFactory factory;
//通过静态代码块构建 SessionFactory
static{
config = new Configuration().configure();
factory = config.buildSessionFactory();
}
public static Session getSession(){
return factory.openSession();
}
}
实现增删改查操作:
(1)增加
package cn.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import cn.Unit.HibernateUtils;
import cn.domain.Student;
public class Add {
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
Student stu = new Student();
stu.setName("lisi");
stu.setAge(21);
session.save(stu);
tx.commit();
}catch(Exception e){
if (null!=tx){tx.rollback();}
e.printStackTrace();
}
}
}
(2)修改
package cn.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import cn.Unit.HibernateUtils;
import cn.domain.Student;
public class Edit {
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
//把id为2的 姓名 zhangsan改为wangwu 年龄 20改为30
Student stu = (Student)session.get(Student.class,new Integer(1));
stu.setName("wangwu");
stu.setAge(30);
session.update(stu);
tx.commit();
}catch(Exception e){
if (null!=tx){tx.rollback();}
e.printStackTrace();
}
}
}
(3)查询
package cn.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import cn.Unit.HibernateUtils;
import cn.domain.Student;
public class FindById {
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction tx = null;
try{
tx = session.beginTransaction();
//查找id为2的学生信息,并输出在控制台
Student stu = (Student)session.get(Student.class,new Integer(2));
System.out.println("姓名:"+stu.getName());
System.out.println("年龄:"+stu.getAge());
tx.commit();
}catch(Exception e){
if (null!=tx){tx.rollback();}
e.printStackTrace();
}
}
}
(4)删除
package cn.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import cn.Unit.HibernateUtils;
import cn.domain.Student;
public class Delete {
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction tx = null;
tx = session.beginTransaction();
//删除id为2的学生
Student stu = (Student)session.get(Student.class,new Integer(2));
session.delete(stu);
tx.commit();
}
}