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