关于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(); } |