03 hibernate入门案例的代码优化(视频笔记)

之所以写这个笔记,并将之放在博客上主要是督促自己坚持系统完整的看视频学习(常跳着看,到头来又觉得没学好吐舌头)。该笔记为观看传智播客视频的笔记

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Hibernate 初始化的过程:

在每个程序里边应该只做一次。
这个过程非常耗时
需要解析配置文件+映射文件

Configuration cfg=new Configuration();
cfg.configure();
SessionFactory sf=cfg.buildSessionFactory();

----------------------------------
想让他只运行一次的话,需要做一个工具类:
   【不被继承+不被实例化!】

工具类一般是不希望被继承的,为此可以给这给类加
final修饰符

public final class HibernateUtil{
    private HibernateUtil(){
    }
}
实例化一个工具类是没有用的,所以为了禁止被new
把构造方法设为私有的,别人就没有办法new了
------------------------------------------------
那么自己怎么去用他呢? 可以把它设计为单例模式
或者将所有的方法都设计为 public static

--------------------------------------

public final class HibernateUtil{
    private HibernateUtil(){
    }

    static{
        Configuration cfg=new Configuration();
        cfg.configure();
        SessionFactory sf=cfg.buildSessionFactory();
     }
}

----------------------------------------------
static 块中,当虚拟机加载这个类的时候会执行这
段代码,之后这段代码就不会被运行了,所以他可以
保证只执行一次。

-----------------------------------------------
而我们最终是想要SessionFactory
为了方便的获得sessionFactory
我们将它设为全局变量,并在类里给出一个将其暴露
出去的get方法。
public final class HibernateUtil{
    private static SessionFactory sessionFactory;

    private HibernateUtil(){
    }

    static{
        Configuration cfg=new Configuration();
        cfg.configure();
        sessionFactory=cfg.buildSessionFactory();
    }

    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }

}
-----------------------------------------------
session和jdbc里的JavaManager是类似的,可以说是
拿到了一个连接。
同理,为了方便的获得session
我们将它设为全局变量,并在类里给出一个将其暴露
出去的get方法。
public final class HibernateUtil{
    private static SessionFactory sessionFactory;

    private HibernateUtil(){
    }

    static{
        Configuration cfg=new Configuration();
        cfg.configure();
        sessionFactory=cfg.buildSessionFactory();
    }

    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }

    public static Session getSession(){
        return SessionFactory.openSession();
    }

}

----------------------------------------
以上的工具类就将hibernate的初始化过程给包装
起来了。

public static void main(String[] args){
    Session s=HibernateUtil.getSession();
    Transaction tx=s.beginTransaction();
    User user=new User();
    user.setBirthday(new Date());
    user.setName("name");

    s.save(user);
    tx.commit();
    s.close();
    System.out.println("id:"+user.getId());
}
-----------------------------------------
以上,并没有对异常进行处理。所以是不规范的

static void  addUser(User user){
    Session s=null;
    Transaction tx=null;
    try{
        s=HibernateUtil.getSession();
        tx=s.beginTransaction()
        s.save(user);
        tx.commit();
    }catch(HibernateException e){
        if(tx!=null)
            tx.rollback();
        throw e;//不能处理的异常要抛出给上一级
    } finally{
        fi(s!=null)
            s.close();
    }

}

--------可以将catch部分省略的
同样会  1.抛出异常;2.回滚事务
static void  addUser(User user){
    Session s=null;
    Transaction tx=null;
    try{
        s=HibernateUtil.getSession();
        tx=s.beginTransaction()
        s.save(user);
        tx.commit();
    }finally{
       if(s!=null)
            s.close();
    }
}

--------------------------------
这样,代码就可以简洁很多了:

public static void main(String[] args){

    User user=new User();
    user.setBirthday(new Date());
    user.setName("name");

    addUser(user);
    System.out.println("id:"+user.getId());
}
static void  addUser(User user){
    Session s=null;
    Transaction tx=null;
    try{
        s=HibernateUtil.getSession();
        tx=s.beginTransaction();
        s.save(user);
        tx.commit();
    }finally{
        if(s!=null)
            s.close();
    }
}

public final class HibernateUtil{
    private static SessionFactory sessionFactory;

    private HibernateUtil(){
    }

    static{
        Configuration cfg=new Configuration();
        cfg.configure();
        sessionFactory=cfg.buildSessionFactory();
    }

    public static SessionFactory getSessionFactory(){
        return sessionFactory;
    }

    public static Session getSession(){
        return SessionFactory.openSession();
    }
}











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值