在上文中我们自己首先单独配置了hibernate的相关xml文件和Java文件。而且还实现了操作案例。但是在实际应用中我们不可能每一次都去获取Configuration对象然后去构建sessionFactory对象。这会浪费资源而且影响效率。所以这次我们就将hibernate初始化的一系列代码封装起来并且执行操作的案例。请看下面附注释的代码
public final class HibernateUtil {
//设计模式的体现。将只执行一次的代码块放到静态块里面。在系统访问HibernateUtil
//的时候。装载虚拟机,静态代码块将会被执行。这样将sf赋值。然后我们就可以拿到了
private static SessionFactory sf;
private HibernateUtil(){}
//当虚拟机在加载的时候会执行这段代码。之后不会执行了
static{
//hibernate的初始化,非常耗时、它读取配置文件。一般只执行一次
Configuration cfg = new Configuration();
//读取配置文件。
cfg.configure();
//类似于jdbc中的DriverManager
sf = cfg.buildSessionFactory();
}
//包装hibernate的返回对象。
public static Session getSession(){
return sf.openSession();
}
}
2、调用封装好的方法完成操作
public class Base {
public static void main(String[] args) {
//赋值要操作的对象
User user = new User();
user.setName("zhanglei");
user.setBirthday(new Date());
//调用静态方法去完成操作。不用写过多的代码
Base.addObj(user);
}
//添加操作很标准的写法
static void addObj(Object obj){
Session s = null;
Transaction tx = null;
try{
//通过封装的类拿到session对象
s = HibernateUtil.getSession();
//打开事务
tx = s.beginTransaction();
//执行操作
s.save(obj);
tx.commit();
}catch(HibernateException e){
//判断事务有没有完全提交的判断方式
if(tx != null){
tx.rollback();
throw e;
}
}finally{
//利用finally关闭session对象
if(s != null){
s.close();
}
}
}
}