JAVA—咖啡館

          ——?dú)g迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗(yàn),分享JAVA帶來的快樂!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問題請與我聯(lián)系。

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

            主流的Persistence Layer解決方案

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

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

            ◆ 采用ObjectRational Mapping(ORM)工具或者是采用面向?qū)ο蟮臄?shù)據(jù)庫(ODBMS);

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

            ◆ JDO。

            JDBC

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

            使用JDBC的解決方案,數(shù)據(jù)必須存儲在關(guān)系型數(shù)據(jù)庫中。

            ORM或者ODBMS

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

            由于ORM工具比較多,它們采用的技術(shù)標(biāo)準(zhǔn)都不盡相同,而且沒有統(tǒng)一的接口,因此,它們在為開發(fā)人員提供方便的同時(shí),也增加了一定的束縛。ORM技術(shù)是比較成熟的,而且已經(jīng)有很多產(chǎn)品了。

            而ODBMS是近幾年發(fā)展起來的,并不十分成熟,而且也沒有得到廣泛的應(yīng)用。目前,眾多ODBMS廠商正在關(guān)注JDO標(biāo)準(zhǔn)并加以實(shí)施。它可能在不久的將可以得到一定的推廣。

            使用ORM或者ODBMS的解決方案,數(shù)據(jù)也必須存儲在關(guān)系或者面向?qū)ο髷?shù)據(jù)庫中。

            EJB CMP

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

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

            EJB提供了除了關(guān)系型數(shù)據(jù)庫以外,更多的存儲支持。

            JDO

          目前,有兩種類型的JDO實(shí)現(xiàn),一種是Sun的JDO,另一種是Castor JDO,這兩者并不兼容。

            Sun JDO是Sun Java Community Process給出的規(guī)范和參照實(shí)現(xiàn)。盡管JDO還有些不成熟,但它很有發(fā)展前景,而且填補(bǔ)了數(shù)據(jù)庫編程領(lǐng)域的一大空白。對Java開發(fā)人員而言,JDO為對象持久性提供了第一個(gè)標(biāo)準(zhǔn)化的、完全面向?qū)ο蟮姆椒āEc此領(lǐng)域中的其它技術(shù)相比,JDO的優(yōu)點(diǎn)是使用起來十分簡單,而且對原始的Java源代碼打亂程度最小。同時(shí),Sun JDO對數(shù)據(jù)存儲類型是透明的。

            而Castor JDO是一個(gè)開源項(xiàng)目,從1999年開始開發(fā)。在開源的JDO項(xiàng)目中,它提供的功能是最強(qiáng)大的。盡管Castor JDO開發(fā)的比較早,但是,隨著Sun JDO的日益成熟,它的優(yōu)勢越來越小。同時(shí),Castor JDO只提供對RDMS的支持。

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

            Torque

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

            Torque的主要特性

            Torque主要包含兩部分:一部分是Generator,它可以產(chǎn)生應(yīng)用需要的所有數(shù)據(jù)庫資源,包括sql和java文件;另外,Torque還提供了一個(gè)運(yùn)行環(huán)境來運(yùn)行產(chǎn)生的類。下面主要討論Torque 的Generator。

            1. 三個(gè)核心文件

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

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

            ◆ $Torque_home/schema/project-schema.xml、id-table-schema.xml 其中,project-schema.xml 存儲表結(jié)構(gòu)信息;而id-table-schema.xml由Torque的IDBroker服務(wù)調(diào)用。

            ◆ $Torque_home/Torque.properties 存儲應(yīng)用執(zhí)行時(shí),由Torque生成的對象模型代碼使用的屬性值。在生成數(shù)據(jù)庫系統(tǒng)資源的時(shí)候不需要這個(gè)文件。

            2. 核心任務(wù)

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

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

            ◆ doc 解析$Torque_home/schema/*.xml,生成對應(yīng)的$Torque_home/src/sql/*.html文件,描述數(shù)據(jù)庫結(jié)構(gòu);

            ◆ create-db 生成不同平臺上產(chǎn)生數(shù)據(jù)庫系統(tǒng)的腳本;

            ◆ insert-sql 執(zhí)行$Torque_home/schema/*-schema.sql文件到指定數(shù)據(jù)庫;

            ◆ sql2xml 解析$Torque_home/schema/schema.sql文件,產(chǎn)生Torque對應(yīng)的數(shù)據(jù)庫文件$Torque_home/schema/schema.xml;

            ◆ id-table-init-sql 根據(jù)$Torque_home/schema/id-table-schema.xml文件產(chǎn)生id表的初始化腳本文件;

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

            3 .Peer

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

            Peer利用Torque數(shù)據(jù)庫Adaptor類來建立與數(shù)據(jù)庫的連接。因?yàn)樗С种髁鞯臄?shù)據(jù)庫系統(tǒng),所以,開發(fā)人員一般情況下不需要為數(shù)據(jù)庫系統(tǒng)編寫Adaptor。

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

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

            4. Criteria

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

          Criteria。

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

            Torque在J2EE中的應(yīng)用

            在Apache Jakarta的項(xiàng)目中,有很多Web 應(yīng)用構(gòu)架,其中Struts、Cocoon及Turbine是比較著名的幾個(gè)。

          Torque作為數(shù)據(jù)庫抽象的工具,雖然是從Turbine中剝離出來的,但是它可以與其它的構(gòu)架很好地結(jié)合,成為Persistence層的優(yōu)秀解決方案。

            應(yīng)用步驟

            在J2EE應(yīng)用,使用Torque的步驟如下:

            1. 系統(tǒng)分析和設(shè)計(jì),直至Business Object;

            2. 按照Business Object模型,形成數(shù)據(jù)庫腳本文件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下運(yùn)行ANT生成對應(yīng)的schema.xml文件運(yùn)行語句為:ant -f build-torque.xml sql2xml;

            5. 編寫$Torque_home/Torque.properties;

            6. 調(diào)用Torque生成對象模型,創(chuàng)建數(shù)據(jù)庫和相關(guān)表(利用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,加入業(yè)務(wù)邏輯處理;

            8. 開發(fā)J2EE應(yīng)用。

            注意問題

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

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

            ◆ 需要配置運(yùn)行時(shí)的數(shù)據(jù)庫連接,配置信息在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

            結(jié)論  

            對于大多數(shù)采用RDMS作為數(shù)據(jù)存儲手段的J2EE項(xiàng)目來說,Torque簡單、易用, 是Persistence層的優(yōu)秀解決方案之一。

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

          Feedback

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

          主站蜘蛛池模板: 怀化市| 濮阳县| 长白| 纳雍县| 嘉鱼县| 瑞昌市| 健康| 通许县| 深水埗区| 香河县| 土默特左旗| 务川| 温泉县| 南平市| 呼玛县| 洞头县| 彭水| 铜山县| 卓资县| 满洲里市| 平山县| 榆林市| 彭水| 潼关县| 黄陵县| 大关县| 丘北县| 玉林市| 密山市| 鄱阳县| 衢州市| 武汉市| 论坛| 定安县| 泰来县| 仁化县| 吉安县| 锦州市| 南康市| 岳池县| 新绛县|