Hibernate_基于单实例配置及使用_初级小结_2_数据库访问

 

关于Hibernate初级配置,在上一此已经有所总结,那是最基础的东西。
现在来总结一下关于Hibernate如何访问数据库中的数据,也是最基础的东西!
不过很HIGH~很NB~             Like Me!
---------------------------------------------------------------------------------------------------------------------------------------------------------
         我们都知道,Hibernate框架是一个作用于程序底层的框架,其实现就是为了简化
数据访问层繁琐的重复代码。虽然我们可以定义一个基于某一数据库数据访问的通用
Dao,但一个通用Dao并不适用于所有的数据库,Hibernate框架对各种类型数据库的访问
做了很细致的封装。使得开发成本大大减低。不过对于程序效率来说,无疑是一种降
低,没办法,鱼和熊掌不可兼得。
---------------------------------------------------------------------------------------------------------------------------------------------------------
         对象的持久化并不是通过加载映射文件所能解决的,映射文件只是指定了实体类
与数据库中对应表的映射关系。对象持久化是利用org.Hibernate.Session对象操作来实现
的。下面详细分析对象持久化操作步骤。基于HibernateSessionFactory.java的实现。这个
通用类在上一节中已经有一定讲述,本人认为,这是Hibernate使用中不可缺少的一节,
否则,代码又会有很多重复,除非程序中的数据库操作就只有一两条。嗨,只有一两
条你还用什么Hibernate,效率啊!!!!
好了,闲话不多说,Begin......
         对象持久化——根据我自己的理解,就是将对象以Hibernate.Session的方式保存到缓
存中。所以:
          一:加载配置文件,并创建Session对象
Session session  = HibernateSessionFactory.getSession();
          二:Hibernate将数据操作交给事务来处理,所以需要开启一个事务org.Hibernate.Transaction
Transaction ts = session.beginTransaction();
继续思考,现在我们应该做的便是执行数据操作语句,将对象持久化。
所以我们必须得有一个实体对象,这个实体对象便是我们从数据库里面取出来单个实体。
查询可以不用开启事务,但增|删|改 功能一定要开启。至于为何,想一想事务的提交和
回滚便明白了。
           三:Member mem = (Member)session.get(Member.class,empId);
又见get()方法,顾名思义——获取。从哪里获取?数据库撒!
数据库中的某张表和某个实体类建立了映射关系,在这里便是Member.java与表(MEMBER)
的映射,所以从MEMBER中取出的数据,当然由Member的对象来封装。所以get(args1,args2)
方法的参数args1才会为Member.class,很容易理解,args2便是我们的查询依据,举个简单的
例子:众所周知,数据库表中的自增字段,一般用Long型的数据类型,如果我们要根据
会员ID来查询会员的详细信息,要查询ID为3的会员信息。那么我们的执行代码应该为:
Member mem = (Member)session.get(Member.class,3L);或
Member mem = (Member)session.get(Member.class,new Long(3));或
Member mem = (Member)session.load(Member.class,3L);
          前两者皆可替换为第三者,在表中有我们所需要的数据的情况下,get()和load()方法皆可
使用,但是,当我们没有从表中搜索出我们想要的数据,或是表中根本没有ID为3的会员,
get()方法的返回值为null,而load()方法会抛出异常。
数据类型若不匹配,Exception就出现了,会告诉你无法转换类型。所以这里会用3L或new Long(3),
只写3的话,默认为int类型,显然不匹配。
O啦,现在数据查到了。简单的单实例对象持久化实现!

对象持久化会抛出HibernateException,事务也需要提交或回滚,以及Session需要关闭。说到这里,大家应该明白
当异常发生的时候应当回滚事务,顺利则提交,不论回滚还是提交,Session应当关闭:
-----------------------------------------------------------------------------------------------实现查询会员功能:-----------------------------------------------------------------------------------------------

public void getMemberById(){
  private static Session session = null;
  private static Transaction tran = null;
  try{
          session = HibernateSessionFactory.getSession();
          tran = session.beginTransaction();  
          Member mem = (Member)session.get(Member.class,3L);
          tran.commit();      //事务提交  
        }
         catch(HibernateException hiberEx){
           if(null!=tran && tran.wasCommitted())
           tran.rollback();   //出错回滚
           System.err.println(hiberEx.getMessage());
       }
        catch(Exception e){
           if(null!=tran && tran.wasCommitted())
            tran.rollback();
           System.err.println(e.getMessage());
       }
       finally{
           session.close();//关闭session
       }
}
很舒服的代码。Doesn't it ?
-----------------------------------------------------------------------------------------------实现添加会员功能:-----------------------------------------------------------------------------------------------
public void addMember(){
  //创建Session方法省略......我们直奔主题
  try{
   tran = session.beginTransaction();
   Member mem = new Member();
   mem.setMemName("sllereak");
   mem.setMemAge(22);
   session.save(user);
   tran.commit();
  }catch(Exception e){
   if(null!=tran && tran.wasCommitted())
            tran.rollback();
           System.err.println(e.getMessage());
  }finally{
   session.close();
  }
}
简单的session.save(entity_obj)方法,添加成功!
-----------------------------------------------------------------------------------------------实现删除会员功能:-----------------------------------------------------------------------------------------------
首先考虑一个问题,既然我们已经将对象持久化到缓存中,为何不能在缓存中做 删|改 的操作?
这个问题问的好,答案是:true!

public void deleteMember(){
  //......
  try{
   tran = session.beginTransaction();
   //假设这里的代码已经将Member的一个对象mem持久化,
   //下面进行对这个mem对象在数据库中删除的操作:
   session.delete(mem);//就一句话,搞定,要是你还能在数据库中找到mem对应的用户,我...我...........那一定是异常!!
   tran.commit();
  }catch(Exception e){
   if(null!=tran && tran.wasCommitted())
            tran.rollback();
           System.err.println(e.getMessage());
  }finally{
   session.close();
  }
}
-------------------------------------------------------------------------------------------实现更新会员信息功能:-------------------------------------------------------------------------------------------

public void updateMember(){
  //......
  try{
   tran = session.beginTransaction();
   //同样假设这里的代码已经将Member的一个对象mem持久化,
   //下面进行对这个mem对象在数据库中更新的操作:
   mem.setMemName("another sllereak");//更新完毕!雷死人了!!
   tran.commit();
  }catch(Exception e){
   if(null!=tran && tran.wasCommitted())
            tran.rollback();
           System.err.println(e.getMessage());
  }finally{
   session.close();
  }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值