ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 一个计算机专业学生几年的编程经验汇总(续二)

一个计算机专业学生几年的编程经验汇总(续二)

原创 Linux操作系统 作者:studios123 时间:2008-04-14 16:47:44 0 删除 编辑
Java杂谈(十一)??ORM

        这是最后一篇Java杂谈了,以ORM框架的谈论收尾,也算是把J2ee的最后一方面给涵盖到了,之所以这么晚才总结出ORM这方面,一是笔者这两周比较忙,另一方面也想善始善终,仔细的先自己好好研究一下ORM框架技术,不想草率的敷衍了事。  

         其实J2ee的规范指南里面就已经包括了一些对象持久化技术,例如JDO(Java       Data       Object)就是Java对象 持久化的新规范,一个用于存取某种数据仓库中的对象的标准化API,提供了透明的对象存储,对开发人员来说,存储数据对象完全不需要额外的代码(如 JDBC       API的使用)。这些繁琐的工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外, JDO很灵活,因为它可以在任何数据底层上运行。JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,比如关系数据 库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。我们如果要理解对象持久化技术,首先要问自己一个问题:为什么传统的JDBC 来持久化不再能满足大家的需求了呢?  

        笔者认为最好是能用JDBC真正编写过程序了才能真正体会ORM的好处,同样的 道理,真正拿Servlet/Jsp做过项目了才能体会到Struts、 Spring等框架的方便之处。很幸运的是笔者这两者都曾经经历过,用混乱的内 嵌Java代码的Jsp加Servlet转发写过完整的Web项目,也用 JDBC搭建过一个完整C/S项目的后台。所以现在接触到新框架才更能体会它们 思想和实现的优越之处,回顾从前的代码,真是丑陋不堪啊。^_^  

        回到正题,我们来研究一下为什么要从JDBC发展到 ORM。简单来说,传统的JDBC要花大量的重复代码在初始化数据库连接上,每次增删改查都要获得 Connection对象,初始化 Statement,执行得到ResultSet再封装成自己的List或者Object,这样造成了在每个数据访问方法中都含有大量冗余重复的代码,考 虑到安全性的话,还要加上大量的事务控制和log记录。虽然我们学习了设计模式之后,可以自己定义Factory来帮助减少一部分重复的代码,但是仍然无 法避免冗余的问题。其次,随着OO思想深入人心,连典型的过程化语言Perl等都冠冕堂皇的加上了OO的外壳,何况是 Java中繁杂的数据库访问持久化 技术呢?强调面向对象编程的结果就是找到一个桥梁,使得关系型数据库存储的数据能准确的映射到Java的对象上,然后针对Java对象来设计对象和方法, 如果我们把数据库的Table当作Class,Record当作Instance的话,就可以完全用面向对象的思想来编写数据层的代码。于是乎, Object       Relationship       Mapping的概念开始普遍受到重视,尽管很早很早就已经有人提出来了。  

         缺点我们已经大概清楚了,那么如何改进呢?对症下药,首先我们要解决的是如何从Data       Schema准备完美的映射到 Object       Schema,另外要提供对数据库连接对象生命周期的管理,对事务不同粒度的控制和考虑到扩展性后提供对XML、 Properties等可配置化的文件的支持。到目前为止,有很多框架和技术在尝试着这样做。例如似乎是封装管理得过了头的EJB、很早就出现目前已经不 在开发和升级了的Apache       OJB、首先支持Manual       SQL的iBATIS,还有公认非常优秀的Hibernate等 等。在分别介绍它们之前,我还想反复强调这些框架都在试图做什么:  

        毕竟Java       Object和数据库 的每一条Record还是有很大的区别,就是类型上来说,DB是没有Boolean类型的。而Java也不得不用封装类(Integer、Double 等)为了能映射上数据库中为null的情况,毕竟Primitive类型是没有null值的。还有一个比较明显的问题是,数据库有主键和外键,而Java 中仍然只能通过基本类型来对应字段值而已,无法规定Unique等特征,更别提外键约束、事务控制和级联操作了。另外,通过 Java       Object预设某Field值去取数据库记录,是否在这样的记录也是不能保证的。真的要设计到完全映射的话,Java的 Static被所有对象共享的变量怎么办?在数据库中如何表现出来……  
我们能看到大量的问题像一座座大山横在那些框架设计者们面前,他们并不 是没有解决办法,而是从不同的角度去考虑,会得到很多不同的解决方案,问题是应该采取哪一种呢?甚至只有等到真正设计出来了投入生产使用了,才能印证出当 初的设想是否真的能为项目开发带来更多的益处。笔者引用一份文档中提到一个健壮的持久化框架应该具有的特点:  
        A       robust       persistence       layer       should       support----  
        1.   Several       types       of       persistence       mechanism  
        2.   Full       encapsulation       of       the       persistence       mechanism.  
        3.   Multi-object       actions  
        4.   Transactions       Control  
        5.   Extensibility  
        6.   Object       identifiers  
        7.   Cursors:       logical       connection       to       the       persistence       mechanism  
        8.   Proxies:       commonly       used       when       the       results       of       a       query       are       to       be       displayed       in       a       list  
        9.   Records:     avoid     the     overhead       of       converting       database       records       to       objects       and       then       back       to       records  
        10.   Multi       architecture  
        11.   Various       database       version       and/or       vendors  
        12.   Multiple       connections  
        13.   Native       and       non-native       drivers  
        14.   Structured       query       language       queries(SQL)  

        现在来简短的介绍一下笔者用过的一些持久化框架和技术,之所以前面强调那么多共通的知识,是希望大家不要盲从流行框架,一定要把握它的本质和卓越的思想好在哪里。  
        1.   Apache       OJB  
        OJB 代表Apache       Object       Relational       Bridge,是Apache开发的一个数据库持久型框 架。它是基于J2ee规范指南下的持久型框架技术而设计开发的,例如实现了ODMG       3.0规范的API,实现了JDO规范的API,        核心实现是Persistence       Broker       API。OJB使用XML文件来实现映射并动态的在 Metadata       layer听过一个Meta-Object-Protocol(MOP)来改变底层数据的行为。更高级的特点包括对象缓存 机制、锁管理机制、 Virtual       代理、事务隔离性级别等等。举个OJB       Mapping的简单例子ojb- repository.xml:  

          
                                    jdbc-type=”INTEGER”       primarykey=”true”       autoincrement=”true”/>  

                  
        

        
                                jdbc-type=”INTEGER”       primarykey=”true”       autoincrement=”true”/>  

                  
                               
                  
                          
                  
        

      2.   iBATIS  
      iBATIS 最大的特点就是允许用户自己定义SQL来组配Bean的属性。因为它的SQL语句是直接写入XML文件中去的,所以可以最大程度上利用到 SQL语法本身 能控制的全部特性,同时也能允许你使用特定数据库服务器的额外特性,并不局限于类似SQL92这样的标准,它最大的缺点是不支持枚举类型的持久化,即把枚 举类型的几个对象属性拼成与数据库一个字段例如VARCHAR对应的行为。这里也举一个Mapping文件的例子sqlMap.xml:  
          
              

              
                      
                      
                      
              

              
                select       *       from       Test       where       TestId=#value#  
              

              
                Update       Tests       set       Name=#name#,       Date=”date”       where       TestId=#testId#  
              
        
  

      3.   Hibernate  
      Hibernate 无疑是应用最广泛最受欢迎的持久型框架,它生成的SQL语句是非常优秀。虽然一度因为不能支持手工SQL而性能受到局限,但随着新一代  Hibernate       3.x推出,很多缺点都被改进,Hibernate也因此变得更加通用而时尚。同样先看一个Mapping文件的例子 customer.hbm.xml来有一个大概印象:  

        
                
                
                        
                                 Customers_CustomerId_Seq     
                        
              

              
              

            
                    
                            
            
 
          …  
            

    
  

        Hibernate 有很多显著的特性,最突出的就是它有自己的查询语言叫做HQL,在HQL中select       from的不是Table而是类名,一方面更加面向 对象,另外一方面通过在hibernate.cfg.xml中配置Dialect为HQL可以使得整个后台与数据库脱离耦合,因为不管用那种数据库我都是 基于HQL来查询,Hibernate框架负责帮我最终转换成特定数据库里的SQL语句。另外 Hibernate在Object-Caching这方面 也做得相当出色,它同时管理两个级别的缓存,当数据被第一次取出后,真正使用的时候对象被放在一级缓存管理,这个时候任何改动都会影响到数据库;而空闲时 候会把对象放在二级缓存管理,虽然这个时候与数据库字段能对应上但未绑定在一起,改动不会影响到数据库的记录,主要目的是为了在重复读取的时候更快的拿到 数据而不用再次请求连接对象。其实关于这种缓存的设计建议大家研究一下Oracle的存储机制(原理是相通的),Oracle牺牲了空间换来时间依赖于很 健壮的缓存算法来保证最优的企业级数据库访问速率。  

        以上是一些Mapping的例子,真正在Java代码中使用多半 是继承各个框架中默认的Dao实现类,然后可以通过Id来查找对象,或者通过 Example来查找,更流行的是更具Criteria查找对象。 Criteria是完全封装了SQL条件查询语法的一个工具类,任何一个查询条件都可以在Criteria中找到方法与之对应,这样可以在Java代码级 别实现SQL的完全控制。另外,现在许多ORM框架的最新版本随着JDk       5.0加入Annotation特性都开始支持用XDoclet来 自动根据Annotation来生成XML配置文件了。  

        笔者不可能详细的讲解每一个框架,也许更多的人在用 Hibernate,笔者是从OJB开始接触ORM技术的,它很原始却更容易让人理解从JDBC到 ORM的过渡。更多的细节是可以从官方文档和书籍中学 到的,但我们应该更加看中它们设计思想的来源和闪光点,不是盲从它们的使用方法。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7780770/viewspace-235730/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2008-04-01

  • 博文量
    15
  • 访问量
    10487