hibernate---学习之二API

来源:互联网 发布:sql注入检测工具 编辑:程序博客网 时间:2024/06/05 05:07
hibernate的API、映射关系----(一对一,一对多,多对多)等映射关系 -----学习之二


一、API:
hibernate的发布包-----documentation---javadocs---index.html就可以打开hibernate的
API


//1、创建配置文件


//2、配置文件的加载(读取配置文件)---目的建立与数据库的连接。


//3、根据配置文件信息创建一级缓存(是一种重量级的而对象),也就是说
一个项目建立一个对象就可以了,不能平凡的创建与销毁。
在这个步骤下会创建一个映射对象(类与表的映射关系)。所以不能平凡的创建与销毁。


HttpSession:用户与浏览器之间的对话,web端


Session::代码与数据库之间的对话,dao层(端)


//4、创建Session,打开会话


//5、开启事物(每一个事物,应该对应着一个事物的提交或回滚,每一个会话可以包
含多个事物,当然事物还可以回滚,回滚到上一个事物提交点,当然一个事物还可以提交一个
会话的多个内容)。
         
//6、事物的提交


//7、Session的关闭


 例子:
      Session 打电话---开始会话
         Transation1
   begin-1 
             买房
   commit-1   
   
         Transation2
   begin-2 
            买车
   commit-2
 
         Transation3
   begin-3 
            美女
   RollBack-3 ----回滚到commit-2那里了。


     Session.close()---关闭会话。


//然后说回来




想要知道我么那天讲什么了---聊了房子--车子---但忘了聊美女---因为美女已经回滚。


MySQL数据库的操作的保存是自动的提交的,但在终端中oracle的提交的手动提交的,所以在这里
讨论事物的问题“就用oracle数据库来说明”。


一次会话的开启-----代表的是一个事物的开启。


执行的sql语句,如果没有提交----那么sql语句只是将数据缓存到数据库的缓冲区中-----
但没有真正的插入、更新、或删除数据表中的数据。----比如回滚(rollBack)----那么就可
以将数据库中的缓冲区中的数据清空了该事物所对应的缓冲区数据。-----再怎么提交也没有
用了。


数据库
   oracle(事物的管理)
   
      Session               事物的开启         事物的提交                       事物的关闭。
   
db   数据库的连接         会话的开启/            commit                       rollBack
                         上一个事物的
提交或者回滚。
(意味着下一个事物的
开始)
   
jdbc   Connection        数据库的连接               是自动管理                conn.rollBack()//保存回滚点
                          事物的(
                         conn.setAutoCommit(true);
                         //设置事物是自动提交的
                         //默认参数是true所以是自动
                          提交的。
                          //还可以conn.commit()
                          //还可以conn.rollBack()
                           )


Hibernate    Session      会话的开启                transaction.commit()        transaction.rollBack();
                           上一个事物的
提交或者回滚。




用jdbc就不要用Hibernate,用Hibernate就不要用jdbc。


Hibernate的封装---代码的抽取。----》


session.save();
session.createQuery();
session.load();
session.delete();
session.update();


从这里就可以看出数据的操作离不开Session,所以我们要封装的是一个Session的工厂。


后期的使用我们可以不要去封装----因为已经有人给我们封装好了-----但我们要清楚它
的原理。


Session的工厂类如下:


HibernateSessionFactory{
    private static SessionFactory factory;
    //只有在当前线程下才能取得该session对象。
    //线程的安全,用于存放session,该对象是线程安全的,只有当前线程才能访问。
    private static ThreadLocal<Session> threadLocal;


    static{
        Configuration config=new Configuration();
config.configure();
factory.config.builSessionFactory();
threadLocal=new ThreadLocal<Session>();
    }
    //可能不知道要关闭那个Session中的事物。


   public Session getSession(){
   Session session=threadLocal.get();//每次获取session的时候都从ThreadLocal包
   //中获取,如果当前的线程中该包为空,则执行if()中的代码,或者当前的线程有
   //session,但session被关闭掉
      if(session==null || !session.isOpen()){//  "||"是一个短路的运算符,当
      //前一个成立,“||”后面的判断条件就不用执行了。
         session.factory.openSession();
threadLoal.set(session);//threadLocal就是一个包。用的时候就取,不用的时候放进去。


      }
      return session;
   }


}


//可能不知道要关闭那个Session中的事物。如下解析:


dao:
Session session=session.getSession();
Transation tran=session.openTransation();
tran.save();
tran.commit();
session.close();






service:
   //转账
   transfer(){
       Session session =getSession();//该session和dao层中的session必须是同一个
       //session。如果不一样,就会引发问题:
       //service中的sessionA,dao层中的sessionB,比如在service中做一个update操作
      //然后在dao层中提交,那 么执行的代码---sessionA.update()-----sessionB.commit()
      //最后sessionA并没提交。而没做操作的sessionB却提交了。那么sessionA的操作就没
      //作用。
       Transaction tran=session.begin();
       dao.updateAccout(1000,alse,A);
       //判断对方的账号   
       dao.updateAccout(1000,true,B);
   }
//所以现在的企业中将事物放在service层来管理,就是说在dao层没有事物的身影了。就是
//在dao层就不要出现事物了。//service拿session的目的是做事物的管理的,不做增、删
//改、查,而做增、删、改、查的是:dao层。


//为了不引发问题、至少保证同一个线程中的dao层的session与service的session是同一个session。




测试的例子:


dao层:
public class UserDao{


    private Session getSession(){


       return HibernateSessionFactory.getSession();
    }
    public void save(User user){
      getSession.save(user);
    }
    public void deleteById(long id){
       Session session=getSession();
       User user=(User)session.getload(User.class,id);
       session.delete(user);
    }
}
//以后测试的时候不要直接测试dao层,因为dao层没有做事物的管理,也就是说dao层必须
//配合service层来使用。service层才是事物的管理。也就是说如果直接测试dao层数据是没有任
//何的改变的。


service层中的代码:


public class UserService{
   public UserDao userDao=new UserDao();
   public void register(User user){
      Session session=HibernateSessionFactory.getSession();
      Transaction tran=session.beginTransaction();
      userDao.save(user);
      tran.commit();//提交dao层和service层中同一个session会话内容的事物。
      session.close();

   }

public void register(User user){
      Session session=HibernateSessionFactory.getSession();
      Transaction tran=session.beginTransaction();
      userDao.update(user);
      tran.commit();//提交dao层和service层中同一个session会话内容的事物。
      session.close();
   }

   //后期的用法,在业务逻辑层的每个方法的开始做事物的开启,每一个方法的结束,做
   //事物的提价,和关闭,这不能再封装了,因为dao层没事事物的管理。而每一次做业务
   //的处理的时候都会调用dao层中的方法,而dao层中的方法一般都是做数据的增、删、

   //改、查操作。

//当然后期还有解决的办法,就是spring技术,面向切面的编程。


}


Test类(测试类):

public class Test{

        public void static nain(String[] args){

       UserService userService =new UserService();

        userService.register(new User("fu",23));

}

}


//如果测试的时候,数据库中没有数据的任何效果-----那要看可能是你的事物的管理是问题了。








0 0