<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA—咖啡館

    ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術,交流工作經驗,分享JAVA帶來的快樂!本網站部分轉載文章,如果有版權問題請與我聯系。

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks
    目前對于J2EE應用中的Persistence Layer的解決方案很多,其中,最近從Apache Turbine中剝離處理的Torque是一個優秀的ORM(Object Relational Mapping,對象角色建模) 解決方案。

      主流的Persistence Layer解決方案

      隨著基于J2EE應用的日益增加,出現了很多Persistence Layer的解決方案。目前主要的解決方案有以下幾種:

      ◆ 自己編寫基于JDBC API的解決方案;

      ◆ 采用ObjectRational Mapping(ORM)工具或者是采用面向對象的數據庫(ODBMS);

      ◆ J2EE/Entity Bean CMP (container-managed persistence);

      ◆ JDO。

      JDBC

      在很多情況下,尤其是沒有采用良好的Persistence Layer解決方案的項目中,開發人員需要自己手動編寫SQL語句,同時還要考慮事務處理等問題。從而使得SQL語句散落在代碼中,可維護性很差。同時,由于每個項目都要重新編寫Persistence 相關的代碼,所以代碼可重用性差。另外要求開發人員對于SQL語法必須非常熟悉,否則調試也比較困難。

      使用JDBC的解決方案,數據必須存儲在關系型數據庫中。

      ORM或者ODBMS

      為了將開發人員從SQL語句中解脫出來,產生了很多ORM的工具。這些工具都比較簡單,并且提供了API支持。

      由于ORM工具比較多,它們采用的技術標準都不盡相同,而且沒有統一的接口,因此,它們在為開發人員提供方便的同時,也增加了一定的束縛。ORM技術是比較成熟的,而且已經有很多產品了。

      而ODBMS是近幾年發展起來的,并不十分成熟,而且也沒有得到廣泛的應用。目前,眾多ODBMS廠商正在關注JDO標準并加以實施。它可能在不久的將可以得到一定的推廣。

      使用ORM或者ODBMS的解決方案,數據也必須存儲在關系或者面向對象數據庫中。

      EJB CMP

      在J2EE的規范中,為EJB定義了兩種Persistence的解決方案:一種是BMP,另一種是CMP。其中CMP不需要將SQL語句加入到代碼中。

      目前,在采用J2EE的應用中,EJB CMP方式得到了廣泛應用。更加引人注意的是,隨著EJB規范的發展,CMP也包含了一些高級關系的內容。但是,CMP的使用比較復雜,對很多開發人員來說比較難以掌握。而且,不是在所有的情況下都適合在系統中采用EJB。

      EJB提供了除了關系型數據庫以外,更多的存儲支持。

      JDO

    目前,有兩種類型的JDO實現,一種是Sun的JDO,另一種是Castor JDO,這兩者并不兼容。

      Sun JDO是Sun Java Community Process給出的規范和參照實現。盡管JDO還有些不成熟,但它很有發展前景,而且填補了數據庫編程領域的一大空白。對Java開發人員而言,JDO為對象持久性提供了第一個標準化的、完全面向對象的方法。與此領域中的其它技術相比,JDO的優點是使用起來十分簡單,而且對原始的Java源代碼打亂程度最小。同時,Sun JDO對數據存儲類型是透明的。

      而Castor JDO是一個開源項目,從1999年開始開發。在開源的JDO項目中,它提供的功能是最強大的。盡管Castor JDO開發的比較早,但是,隨著Sun JDO的日益成熟,它的優勢越來越小。同時,Castor JDO只提供對RDMS的支持。

      從上面的分析我們可以看到,由于目前絕大多數應用系統的數據都是存儲在RDMS中,而且JDO目前還不十分完善,因此,在項目中還是應該采用成熟的ORM工具。

      Torque

      Torque是一種ORM的工具,它最早是Apache Jakarta Turbine項目的一部分,現在已經從Turbine中剝離出來,可以獨立使用。目前,它的版本是3.0。

      Torque的主要特性

      Torque主要包含兩部分:一部分是Generator,它可以產生應用需要的所有數據庫資源,包括sql和java文件;另外,Torque還提供了一個運行環境來運行產生的類。下面主要討論Torque 的Generator。

      1. 三個核心文件

      要利用Torque的Generator,必須配置好以下三個文件(Torque的安裝路徑為$Torque_home):

      ◆ $Torque_home/build.properties 存儲數據庫系統的屬性,主要有項目名稱、數據庫類型、數據庫鏈接URL、Driver、用戶名、密碼及主機名等。Torque利用該文件的屬性,建立與數據庫系統的連接。

      ◆ $Torque_home/schema/project-schema.xml、id-table-schema.xml 其中,project-schema.xml 存儲表結構信息;而id-table-schema.xml由Torque的IDBroker服務調用。

      ◆ $Torque_home/Torque.properties 存儲應用執行時,由Torque生成的對象模型代碼使用的屬性值。在生成數據庫系統資源的時候不需要這個文件。

      2. 核心任務

      利用Torque提供的Generator,可以完成下面的主要任務:

      ◆ sql 解析$Torque_home/schema/*.xml,生成對應的$Torque_home/src/sql/*.sql文件;

      ◆ doc 解析$Torque_home/schema/*.xml,生成對應的$Torque_home/src/sql/*.html文件,描述數據庫結構;

      ◆ create-db 生成不同平臺上產生數據庫系統的腳本;

      ◆ insert-sql 執行$Torque_home/schema/*-schema.sql文件到指定數據庫;

      ◆ sql2xml 解析$Torque_home/schema/schema.sql文件,產生Torque對應的數據庫文件$Torque_home/schema/schema.xml;

      ◆ id-table-init-sql 根據$Torque_home/schema/id-table-schema.xml文件產生id表的初始化腳本文件;

      上述任務需要ANT的支持,運行命令為$Torque_home/ant-f build-torque.xml $taskname。

      3 .Peer

    Peer是Torque使用的ORM工具。它比其它的工具(例如Castor、Osage等)的層次要低。開發人員需要手工編寫一些代碼,但是這從一定意義上增加了靈活性。

      Peer利用Torque數據庫Adaptor類來建立與數據庫的連接。因為它支持主流的數據庫系統,所以,開發人員一般情況下不需要為數據庫系統編寫Adaptor。

      在建立了項目數據庫系統的Schema文件后,運行“ant -f build-torque.xml”。Torque為Schema 中的每個表的對象模型生成四個類,例如開發人員在project-schema.xml 中定義了Author表,則Torque生成的四個類為Author、AuthorPeer、 BaseAuthor、BaseAuthorPeer等。其中Author和AuthorPeer分別是BaseAuthor和BaseAuthorPeer 的子類。這兩個基類(BaseAuthor、BaseAuthorPeer)包含了Torque的生成邏輯,在開發中不應該修改。因為Torque會在再次生成對象模型時覆蓋這些文件,所以系統中的業務邏輯應該放在Author和AuthorPeer類中。

      在Torque中,AuthorPeer和BaseAuthorPeer稱為對等類(Peer Classes),而Author和BaseAuthor稱為數據對象(Data Objects)。對等類和數據對象之間的區別是:“對等類”封裝數據表信息,并提供靜態方法對表進行增加、刪除、修改記錄的操作;“數據對象”封裝表中的記錄信息,并對每個字段提供getters/mutators方法。

      4. Criteria

    Criteria是一對SQL查詢標準的抽象對象,開發人員利用它來封裝特定的SQL語句。Criteria實際上是SQL語句中域名和值之間的映射,默認的Comparator是等于(=)。同時,它還提供基本的Comparator,以及Join、Order by、Distinct等。更多的方法及屬性,請查看org.apache.torque.util.

    Criteria。

      Criteria提供了一般意義上的SQL功能,如果仍然不能滿足開發的需要,開發人員仍然可以手寫SQL語句。

      Torque在J2EE中的應用

      在Apache Jakarta的項目中,有很多Web 應用構架,其中Struts、Cocoon及Turbine是比較著名的幾個。

    Torque作為數據庫抽象的工具,雖然是從Turbine中剝離出來的,但是它可以與其它的構架很好地結合,成為Persistence層的優秀解決方案。

      應用步驟

      在J2EE應用,使用Torque的步驟如下:

      1. 系統分析和設計,直至Business Object;

      2. 按照Business Object模型,形成數據庫腳本文件database.sql;

      3. 編寫$Torque_home/build.properties;

      4.編寫$Torque_home/schema/project-schema.xml及$Torque_home/schema/id-table-schema.xml,或者將database.sql拷貝到$Torque_home/schema/schema.sql, 在$Torque_home下運行ANT生成對應的schema.xml文件運行語句為:ant -f build-torque.xml sql2xml;

      5. 編寫$Torque_home/Torque.properties;

      6. 調用Torque生成對象模型,創建數據庫和相關表(利用ANT):

        ◆ ant -f build-torque.xml

        ◆ ant -f build-torque.xml create-db

        ◆ ant -f build-torque.xml id-table-init-sql

        ◆ ant -f build-torque.xml insert-sql

      7. 修改*.java和*Peer.java,加入業務邏輯處理;

      8. 開發J2EE應用。

      注意問題

      Torque在文檔中提供了一個教程,可以幫助開發人員了解Torque的用法,也提供了一個完整的示例。但是,在使用Torque的J2EE開發中,還需要注意以下問題:

      ◆ Torque的初始化只能進行一次:Torque.init(“Torque.properties”)。如果是采用Central Controller,則在Servlet的init方法中進行初始化比較合適。

      ◆ 需要配置運行時的數據庫連接,配置信息在Torque.properties中。下面是采用Torque的old pool、Jdbc2Pool、JNDI及ConnectionPoolDataSource等各種形式的配置文件:

    ## Using torque''s old pool
                #torque.dsfactory.MMCycle.factory=org.apache.
                torque.dsfactory.TorqueDataSourceFactory
                #torque.dsfactory.MMCycle.pool.defaultMax-Connections=10
                #torque.dsfactory.MMCycle.pool.maxExpiry-Time=3600
                #torque.dsfactory.MMCycle.pool.connection-WaitTimeout=10
                #torque.dsfactory.MMCycle.connection.driver=
                com.microsoft.jdbc.sqlserver.SQLServerDriver
                #torque.dsfactory.MMCycle.connection.url=jdbc:microsoft:
                  sqlserver://DB1:1433;DatabaseName=MMCycle;SelectMethod=cursor
                #torque.dsfactory.MMCycle.connection.user = sa
                #torque.dsfactory.MMCycle.connection.password = (7MOR6pa2)
                ## Using Jdbc2Pool
                #torque.dsfactory.bookstore.factory=\
                #  org.apache.torque.dsfactory.Jdbc2PoolDataSourceFactory
                #torque.dsfactory.bookstore.pool.defaultMaxActive
                =10
                #torque.dsfactory.bookstore.pool.testOnBorrow
                =true
                #torque.dsfactory.bookstore.pool.validationQuery
                =SELECT 1
                #torque.dsfactory.bookstore.connection.driver = org.gjt.mm.mysql.Driver
                #torque.dsfactory.bookstore.connection.url =
                  jdbc:mysql://localhost:3306/torque
                #torque.dsfactory.bookstore.connection.user = user
                #torque.dsfactory.bookstore.connection.password = password
                ## Using jndi
                #torque.dsfactory.bookstore.factory=org.apache.
                torque.dsfactory.JndiDataSourceFactory
                #torque.dsfactory.bookstore.    jndi.path=jdbc/bookstore
                #torque.dsfactory.bookstore.jndi.java.naming.
                factory.initial = org.apache.naming.java.java-URLContextFactory
                #torque.dsfactory.bookstore.jndi.java.naming.
                factory.url.pkgs = org.apache.naming
                #torque.dsfactory.bookstore.datasource.classname=
                org.apache.torque.pool.TorqueClassicDataSource
                #torque.dsfactory.bookstore.datasource.
                dataSourceName=jdbc/DBbookstore
                #torque.dsfactory.bookstore.datasource.jndi-Environment.java.naming.factory.initial
                  =org.apache.naming.java.javaURLContextFactory
                #torque.dsfactory.bookstore.datasource.jndi-Environment.java.naming.factory.url.pkgs
                   =org.apache.naming
                #torque.dsfactory.bookstore.datasource.default-MaxConnections=10
                ## ConnectionPoolDataSource
                #torque.dsfactory.bookstore.factory=
                  org.apac-he.torque.dsfactory.JndiDataSourceFactory
                #torque.dsfactory.bookstore.jndi.path=jdbc/DBbookstore
                #torque.dsfactory.bookstore.jndi.java.naming.
                factory.initial = org.apache.naming.java.
                javaURLContextFactory
                #torque.dsfactory.bookstore.jndi.java.naming.
                factory.url.pkgs = org.apache.naming
                #torque.dsfactory.bookstore.datasource.classname=
                  org.apache.commons.dbcp.cpdsadapter.Driver-AdapterCPDS
                #torque.dsfactory.bookstore.datasource.driver =
                  org.gjt.mm.mysql.Driver
                #torque.dsfactory.bookstore.datasource.url =
                  jdbc:mysql://localhost:3306/torque
                #torque.dsfactory.bookstore.datasource.user = user
                #torque.dsfactory.bookstore.datasource.password =
                  password

      結論  

      對于大多數采用RDMS作為數據存儲手段的J2EE項目來說,Torque簡單、易用, 是Persistence層的優秀解決方案之一。

    posted on 2008-05-22 11:20 rogerfan 閱讀(495) 評論(1)  編輯  收藏 所屬分類: 【Torque學習】

    Feedback

    # re: 【轉】優秀的對象角色建模解決方案-Torque 2008-06-09 19:58 adfa
    公司招學員(java),學費6000元,小班授課,詳情請登陸www.skyjava.com  回復  更多評論
      

    主站蜘蛛池模板: 精品久久久久久久久免费影院| 久久久久久久国产免费看| 3344永久在线观看视频免费首页| 亚洲午夜福利AV一区二区无码| 真人无码作爱免费视频| 免费国产真实迷j在线观看| AV激情亚洲男人的天堂国语| 免费国产人做人视频在线观看| 成人婷婷网色偷偷亚洲男人的天堂 | 免费不卡视频一卡二卡| 亚洲中文字幕在线无码一区二区| 亚洲视频免费观看| 亚洲香蕉在线观看| 白白国产永久免费视频| 日本一区二区在线免费观看 | 亚洲中文字幕久久无码| 国产精品免费看久久久无码| 国产精品亚洲一区二区三区在线观看 | 黄床大片免费30分钟国产精品| 国产亚洲精品岁国产微拍精品| 久久永久免费人妻精品| 久久亚洲精精品中文字幕| 亚欧色视频在线观看免费| 亚洲中文字幕久久精品无码VA| 波多野结衣免费视频观看| 亚美影视免费在线观看| 亚洲男人都懂得羞羞网站| 一个人看www在线高清免费看 | 国产精品美女自在线观看免费| 免费VA在线观看无码| 久久精品国产亚洲av麻| 一二三四影视在线看片免费| 老湿机一区午夜精品免费福利| 亚洲中文字幕在线乱码| 18禁免费无码无遮挡不卡网站| 国产精品久久免费| 高潮毛片无遮挡高清免费| 亚洲伦另类中文字幕| 日韩精品无码人妻免费视频 | 亚洲免费福利在线视频| 美女羞羞视频免费网站|