现在的位置: 首页 > 综合 > 正文

SSH系列(二)–为什么要用Hibernate,给个理由先?

2013年03月31日 ⁄ 综合 ⁄ 共 2145字 ⁄ 字号 评论关闭

       SSH中的H指的就是Hibernate ,这个已经被炒烂了的o/r mapping的开源项目,那为什么我们在项目中的和数据库交互的那块操作(说的书面点就是持久化部分)要用它了,它比我们以前用的JDBC的硬编码或是使用了DTO(POJO),DAO这样的模式的模块又好在哪里了?(当然JDBC硬编码的做法确实比较ugly,现在这样做的也比较少了吧)

       要想说清这个,当然有很多种说法,观点也不尽一致,所以我们先来看看HIbernate具体都有些什么,我们怎么来使用它,然后再对比和分析。

        Hibernate既然是持久化的框架,干得自然是和数据库打交道的事,所以其概念和使用上应该不难,但是其文档(中文)也有200多页,可以看出其内容还是不少(在这里向翻译文档的团队表示感谢,呵呵)。从整体上看要使用它需要两种配置文件,一个是hibernate.cfg.xml,它是与数据库连接的配置文件(事务类型也是在其中配置的),支持普通的JDBC连接,也支持使用JNDI的数据源连接,它是放在class-path下;另一个配置文件是xxx.hbm.xml,它是某个POJO和一个或多个数据库表的对应关系的配置文件,也即是o/r映射的配置文件,也是放在class-path下,而且在hibernate.cfg.xml中要引入这些xxx.hbm.xml。

        我们在代码阶段要先new一个Configuration,它需要载入hibernate.cfg.xml;然后根据这个Configuration build出一个SessionFactory,注意当sessionFactory建立后,如果在改动configuration,sessionFactory不会受影响,而且sessionFactory的建立是很耗资源的,所以我们对一个数据库的应用应该只创建一个SessionFactory。如果我们的操作要涉及多个库,我们可以配置多个hibernate.cfg.xml,从而生成多个Configuration,进而创建多个SessionFactory。

        当得到SessionFactory后我们就可以建立Session对象了,我个人感觉Session有点像JDBC中的Connection和Statement的混合,因为它确实是和数据库连接的一个具体实例,同时它下面有save,update等方法,可以操作数据库,所以又不单单是个Connection,也有Statement的意思。得到了Session后,我们通过它下面的各种方法,就可以完成对对象的CRUD,那在hibernate中对象和数据库表之间是有对应关系的,所以通过对对象的操作,hibernate自动完成对数据库表的操作,它底层也是通过JDBC的PreparedStatement来完成的。

       但在hibernate3.x以后情况又有些不同了,在3.x中,HQL的功能加强了很多,具有了update,delete的功能,再加上Session的find方法的取消,所以对于Query的使用越来越多,于是Session就越来越像Connection了。HQL很像传统的SQL语言,但它们两者还是有很明显的不同,SQL面向的是二维的结构化的数据,而HQL则是面向的数据对象。

       HQL中包括简单的实体查询,对象属性的查询(相当于SQL 中的select某几个字段),分组和排序,where条件查询(注意在这里,我们为了避免sql injection问题,对于条件变量要采用现在HQL语句中用占位符的方法,再set进去,相当于PrepareStatement),联合查询(SQL中的join) ,子查询,删除和修改。对于HQL,我们还可以在配置文件中写,然后通过代码找到,不用再代码中直接写HQL字符串。另外有一点要说明的是我们如果要调用存储过程,则相对麻烦而且只能调用带返回结果集的存储过程,简单的做法是不用hibernate的API来做,我们可以通过Session得到Connection对象,从而按照JDBC的方式来调用,本身hibernate并不提倡用存储过程 ,它认为存储过程和具体的DBMS有很强的耦合性。。hibernate3中还提供了一个Criteria的对象来进行查询工作,它本身只是一个查询容器,具体的查询条件要通过Criteria.add方法来添加到对象中。不过其功能现在没有HQL强。而且在hibernate3中还提供了一个Criteria的实现--DetachedCriteria,它可以脱离Session实例独立存在,具体的就不多说了,用到的时候看看文档吧。

       由以上的知识点我们不能看出hibernate是比较简单和容易使用的,但事实并不完全是这样,我们知道o/r mapping中,数据库表是二维的关系型数据库表,而我们的POJO是面向对象的结构(面向对象的特点有封装,继承,多态),这两者之间的映射并不是那么简单,下面我们来看一下hibernate中比较难的那个方面。

       一个是复杂的实体映射,另一个是数据关联。

      未完,待续.........

 

抱歉!评论已关闭.