首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > SSH系列(二)--为什么要用Hibernate,给个理由先?
【标  题】:SSH系列(二)--为什么要用Hibernate,给个理由先?
【关键字】:SSH,--,Hibernate
【来  源】:http://blog.csdn.net/mshust2006/archive/2006/11/26/1415912.aspx

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

       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中比较难的那个方面。

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

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

 
事务管理最佳实践全面解析:【上一篇】
将数组传递给方法:【下一篇】
【相关文章】
  • delphi中字符使用技巧---在制作dll时临阵磨枪
  • ajax--1 AJAX - X
  • ajax--2 基于AJAX的WEB设计
  • SegWord 的进展--词库结构
  • Defect Reporting (Section 2) --怎样使Defect Report更加Effective
  • How hibernate benifit the Java Programming?
  • Hibernate学习(4)----JMX技术
  • 设计模式--FlyWeight--结构型
  • Myeclipse开发struts+hibernate+spring新手入门---环境配置
  • Myeclipse平台struts+hibernate+spring项目开发示例
  • 【随机文章】
  • 文件的访问权限
  • Castle ActiveRecord学习实践(5):实现Many–Many关系的映射
  • Win32教程32-多文档界面(MDI) 下
  • Windows 窗体中的简单数据访问
  • ERP系统DDS全面升级通过程序自动实施的过程
  • 常用BT下载工具比较[转]
  • Mysql:用phpmyadmin匯出資料至XLS時中文亂碼7/8
  • 在AS 4 下安装ORACLE10G
  • 谁能告诉我这段代码的意
  • 新手SuSE Linux 10.1上手(硬盘安装等)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.