文章摘要
Torque項(xiàng)目是Apache的公開(kāi)源代碼項(xiàng)目,主要用于生成訪問(wèn)數(shù)據(jù)庫(kù)的資源和java代碼、提供使用這些代碼訪問(wèn)數(shù)據(jù)庫(kù)的運(yùn)行時(shí)(runtime)環(huán)境。通過(guò)使用Torque,你可以使用面向?qū)ο蠓绞皆L問(wèn)數(shù)據(jù)庫(kù),不再需要編寫(xiě)任何SQL語(yǔ)句。本文中給大家詳細(xì)的介紹了如何使用Torque框架訪問(wèn)數(shù)據(jù)庫(kù)的整個(gè)過(guò)程,希望能夠指導(dǎo)大家熟練使用Torque。
關(guān)鍵詞
Torque 訪問(wèn) 數(shù)據(jù)庫(kù)
1 Torque簡(jiǎn)介
Torque是Apache的公開(kāi)源代碼項(xiàng)目,最開(kāi)始是Turbine框架的組成部分,后面被獨(dú)立出來(lái)作為一個(gè)單獨(dú)的組件,歸入了Apache的DB項(xiàng)目下。目前最新的版本是3.1。Torque的主要功能是實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),方式是通過(guò)生成訪問(wèn)數(shù)據(jù)庫(kù)的資源(包括創(chuàng)建數(shù)據(jù)庫(kù)、表和初始化表的sql語(yǔ)句)和java代碼、提供使用這些代碼訪問(wèn)數(shù)據(jù)庫(kù)的運(yùn)行時(shí)(runtime)環(huán)境。關(guān)于Torque的詳細(xì)介紹請(qǐng)大家參考http://db.apache.org/torque/。
目前Torque支持的數(shù)據(jù)庫(kù)包括mysql、oracle、sqlserver、db2等,還包括對(duì)weblogic的數(shù)據(jù)源的支持,詳細(xì)的支持列表大家可以到http://db.apache.org/torque/查找到,你還可以參考http://db.apache.org/torque/db-adapters.html編寫(xiě)你自己的數(shù)據(jù)庫(kù)支持類。
1.1 Torque和傳統(tǒng)數(shù)據(jù)庫(kù)訪問(wèn)方式的差異
下面是兩種方式訪問(wèn)數(shù)據(jù)庫(kù)時(shí)的代碼片段,相信大家可以很清晰的感覺(jué)到他們之間的差異。
1.1.1 傳統(tǒng)數(shù)據(jù)庫(kù)訪問(wèn)
下面這段代碼實(shí)現(xiàn)向數(shù)據(jù)庫(kù)中插入一條記錄:
Class.forName("%Database_Driver%").newInstance(); java.sql.Connection connection; connection = DriverManager.getConnection(url,userid,pwd); Statement statement = connection.createStatement(); String sql = ""; statement.ExecuteUpdate("insert into tablename values(field_value1, field_value1…)"); statement.close(); connection.close();
1.1.2 使用Torque
下面這段代碼演示了使用Torque后我們插入一條記錄的過(guò)程:
TableOBJ tableObj = new TableObj(); tableObj.SetFieldName1(fieldvalue1); tableObj.SetFieldName2(fieldvalue2); ... tableObj.Save();
下面的章節(jié),作者將詳細(xì)的描述如何配置使用Torque的全過(guò)程以及需要注意的內(nèi)容。作者選擇了mysql作為目的數(shù)據(jù)庫(kù)進(jìn)行操作(中間有一些內(nèi)容提到了SqlServer,主要是因?yàn)槭褂肧qlServer或者其它如oracle、db2等作為目的數(shù)據(jù)庫(kù)在某些操作上和使用mysql作為目的數(shù)據(jù)庫(kù)有很大的差異,這些地方作者做了特別說(shuō)明)。
[注] 作者的演示過(guò)程使用ant1.5.1和Torque3.1,如果按照作者的過(guò)程行不通,請(qǐng)確認(rèn)工具的版本是否正確。
2 環(huán)境配置
2.1 組件下載安裝
為了使用Ant和Torque,你必須下載安裝Sun提供的J2SE,可以到http://java.sun.com下載J2SE的最新版本。
在Torque的使用過(guò)程中,很多的工作都是通過(guò)ant來(lái)完成的,所以你需要先下載ant工具包,由于Torque的build-torque.xml中使用了ant中的option特性,所以最好下載ant1.5.1版本,你可以到http://ant.apache.org/下載最新的ant版本。作者下載后解壓縮到c:/ant(后面章節(jié)將使用%ant_home%來(lái)表示這個(gè)目錄)目錄中。
然后請(qǐng)下載Torque的3.1版本(包括http://db.apache.org/builds/torque/release/3.1/torque-3.1.zip和http://db.apache.org/builds/torque/release/3.1/torque-gen-3.1.zip),然后解壓縮到同一個(gè)目錄中,作者使用了E:\test\torque目錄(后面章節(jié)將使用%Torque_home%來(lái)表示這個(gè)目錄)。
安裝完成后,請(qǐng)?jiān)O(shè)置JAVA_HOME環(huán)境變量指向安裝J2SE的目錄,以便各項(xiàng)ant工作能夠順利完成。
2.2 演示例子說(shuō)明
作者的演示例子使用了一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù),它包括三個(gè)表:author, publisher和 book表。Author表保存書(shū)的作者信息,publisher表保存書(shū)的出版者信息,而book表保存書(shū)的相關(guān)信息如title、ISBN信息等。
2.3 修改配置文件
安裝好Torque后,為了讓它成功執(zhí)行,必須配置以下配置文件build.properties、Torque.properties、mybookstore-schema.xml、id-table-schema.xml,下面的章節(jié)詳細(xì)的說(shuō)明了他們的作用和需要添加的內(nèi)容。
2.3.1 build.properties
build.properties文件中設(shè)置了生成訪問(wèn)數(shù)據(jù)庫(kù)需要的資源文件和java代碼需要用到的環(huán)境變量。下面這段是作者使用mysql數(shù)據(jù)庫(kù)時(shí)的文件內(nèi)容:
#工程名稱 torque.project = bookstore #數(shù)據(jù)庫(kù)類型 torque.database = mysql #生成java代碼的包特性 torque.targetPackage = com.chinacreator torque.database.createUrl = jdbc:mysql://127.0.0.1:3306/mysql #數(shù)據(jù)庫(kù)URL #注意:數(shù)據(jù)庫(kù)名應(yīng)該和工程名保持一致 torque.database.buildUrl = jdbc:mysql://127.0.0.1:3306/bookstore torque.database.url = jdbc:mysql://127.0.0.1:3306/bookstore #數(shù)據(jù)庫(kù)驅(qū)動(dòng)類 torque.database.driver = org.gjt.mm.mysql.Driver #連接數(shù)據(jù)庫(kù)使用的用戶名 torque.database.user = root #連接數(shù)據(jù)庫(kù)使用的密碼 torque.database.password = ioffice #數(shù)據(jù)庫(kù)的主機(jī)IP torque.database.host = 127.0.0.1
如果使用其它的數(shù)據(jù)庫(kù),那么請(qǐng)修改里面的相關(guān)信息如數(shù)據(jù)庫(kù)驅(qū)動(dòng)類、數(shù)據(jù)庫(kù)URL、訪問(wèn)數(shù)據(jù)庫(kù)的用戶名/密碼等,下面是作者使用microsoft 的SqlServer的配置文件內(nèi)容:
torque.project = mybookstore torque.database = mssql torque.targetPackage = com.chinacreator torque.database.createUrl = jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mysms torque.database.buildUrl = jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mybookstore torque.database.url = jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mybookstore torque.database.driver = com.microsoft.jdbc.sqlserver.SQLServerDriver torque.database.user = sa torque.database.password = sa torque.database.host = 127.0.0.1
2.3.2 Torque.properties
這個(gè)配置文件是使用Toorque訪問(wèn)數(shù)據(jù)庫(kù)時(shí)初始化環(huán)境需要用到的一些配置內(nèi)容,下面是作者使用MySql作為目的數(shù)據(jù)庫(kù)時(shí)的配置文件內(nèi)容:
#Torque應(yīng)用的根目錄 torque.applicationRoot = . #Torque中的日志信息的設(shè)置,不需要修改 log4j.category.org.apache.torque = ALL, org.apache.torque log4j.appender.org.apache.torque = org.apache.log4j.FileAppender log4j.appender.org.apache.torque.file = ${torque.applicationRoot}/logs/torque.log log4j.appender.org.apache.torque.layout = org.apache.log4j.PatternLayout log4j.appender.org.apache.torque.layout.conversionPattern = %d [%t] %-5p %c - %m%n log4j.appender.org.apache.torque.append = false torque.defaults.pool.logInterval = 0 # 等待數(shù)據(jù)庫(kù)連接的時(shí)間 torque.defaults.pool.connectionWaitTimeout = 10 # 數(shù)據(jù)庫(kù)連接池中的最大連接數(shù) torque.defaults.pool.defaultMaxConnections = 80 # 數(shù)據(jù)庫(kù)連接在連接池中的最大存在時(shí)間 torque.defaults.pool.maxExpiryTime = 3600 # 數(shù)據(jù)源的連接驅(qū)動(dòng)類 torque.defaults.connection.driver = org.gjt.mm.mysql.Driver # 數(shù)據(jù)源的URL torque.defaults.connection.url = jdbc:mysql://localhost:3306/bookstore #訪問(wèn)數(shù)據(jù)的用戶名和密碼 torque.defaults.connection.user = root torque.defaults.connection.password = ioffice #默認(rèn)數(shù)據(jù)庫(kù)其中及本文件中剩下的bookstore都應(yīng)該和build.peoperties中的工程名保持一致 torque.database.default=bookstore torque.database.bookstore.adapter=mysql torque.dsfactory.bookstore.factory = org.apache.torque.dsfactory.SharedPoolDataSourceFactory 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/bookstore torque.dsfactory.bookstore.connection.user = root torque.dsfactory.bookstore.connection.password = ioffice torque.idbroker.cleverquantity=true torque.manager.useCache = true
2.3.3 project-schema.xml
這個(gè)文件位于%Torque_home%/schema目錄下,文件名中的project應(yīng)該和build.properties中的工程名保持一致,它主要是描述工程中使用的數(shù)據(jù)庫(kù)信息,包括數(shù)據(jù)庫(kù)、表、字段的特性等。這里應(yīng)該是bookstore-schema.xml,下面的信息是作者使用mysql時(shí)對(duì)應(yīng)的bookstore-schema.xml的內(nèi)容:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database_3_1.dtd"> <database name="bookstore" defaultIdMethod="idbroker"> <table name="book" description="Book Table"> <column name="book_id" required="true" primaryKey="true" type="INTEGER" description="Book Id"/> <column name="title" required="true" type="VARCHAR" size="255" description="Book Title"/> <column name="isbn" required="true" type="VARCHAR" size="24" javaName="ISBN" description="ISBN Number"/> <column name="publisher_id" required="true" type="INTEGER" description="Foreign Key Publisher"/> <column name="author_id" required="true" type="INTEGER" description="Foreign Key Author"/> <foreign-key foreignTable="publisher"> <reference local="publisher_id" foreign="publisher_id"/> </foreign-key> <foreign-key foreignTable="author"> <reference local="author_id" foreign="author_id"/> </foreign-key> </table> <table name="publisher" description="Publisher Table"> <column name="publisher_id" required="true" primaryKey="true" type="INTEGER" description="Publisher Id"/> <column name="name" required="true" type="VARCHAR" size="128" description="Publisher Name"/> </table> <table name="author" description="Author Table"> <column name="author_id" required="true" primaryKey="true" type="INTEGER" description="Author Id"/> <column name="first_name" required="true" type="VARCHAR" size="128" description="First Name"/> <column name="last_name" required="true" type="VARCHAR" size="128" description="Last Name"/> </table> </database>
關(guān)于如何使用該文件描述數(shù)據(jù)庫(kù)以及如何編寫(xiě)該文檔,請(qǐng)大家參考Torque的幫助文檔或者到Torque的網(wǎng)站(http://db.apache.org/torque/)查詢相關(guān)內(nèi)容
2.3.4 id-table-schema.xml
這個(gè)文件用于描述project-schema.xml中相關(guān)ID內(nèi)容的增長(zhǎng)特性,它用于指導(dǎo)Torque生成id_table表,他保存了project-schema.xml中相關(guān)ID自動(dòng)增長(zhǎng)的相關(guān)內(nèi)容,實(shí)現(xiàn)類似于Oracle中的Sequence的功能。下面是演示實(shí)例的對(duì)應(yīng)文件:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> <!DOCTYPE database SYSTEM "http://db.apache.org/torque/dtd/database_3_1.dtd"> <database name="bookstore"> <table name="ID_TABLE" idMethod="idbroker"> <column name="ID_TABLE_ID" required="true" primaryKey="true" type="INTEGER"/> <column name="TABLE_NAME" required="true" size="255" type="VARCHAR"/> <column name="NEXT_ID" type="INTEGER"/> <column name="QUANTITY" type="INTEGER"/> <unique> <unique-column name="TABLE_NAME"/> </unique> </table> </database>
[注] Torque將根據(jù)后面的兩個(gè)XML文件生成自動(dòng)建立數(shù)據(jù)庫(kù)、表等的相關(guān)的SQL數(shù)據(jù)和訪問(wèn)該數(shù)據(jù)庫(kù)的java代碼。
2.4 類路徑
為了建立使用Torque的相關(guān)環(huán)境,需要將%Torque_home%/lib下面的所有。jar文件,放入classpath中,其他需要加入classpath中的還包括%Torque_home%,%Torque_home%/templates,還有支持訪問(wèn)數(shù)據(jù)庫(kù)的jdbc驅(qū)動(dòng)的.jar文件。
3 生成訪問(wèn)資源
3.1 生成訪問(wèn)數(shù)據(jù)庫(kù)的資源
1.生成訪問(wèn)數(shù)據(jù)庫(kù)的java代碼
您可以使用下面的操作來(lái)生成訪問(wèn)數(shù)據(jù)庫(kù)的java代碼:
ant -f build-torque.xml
這個(gè)操作將順帶產(chǎn)生生成數(shù)據(jù)庫(kù)、表等的相關(guān)SQL語(yǔ)句。
2.自動(dòng)生成數(shù)據(jù)庫(kù)
使用Ant來(lái)執(zhí)行下面的代碼,他會(huì)幫您自動(dòng)建立數(shù)據(jù)庫(kù):
ant -f build-torque.xml create-db
[注] 如果是使用Microsoft SqlServer,因?yàn)門(mén)orque中目前還沒(méi)有支持創(chuàng)建數(shù)據(jù)庫(kù)的相關(guān)SQL代碼實(shí)現(xiàn),所以需要自己手工建立相對(duì)應(yīng)的數(shù)據(jù)庫(kù)。
3.自動(dòng)生成相關(guān)表
使用Ant來(lái)執(zhí)行下面的代碼,他會(huì)幫您自動(dòng)建立數(shù)據(jù)表和一些初始數(shù)據(jù)內(nèi)容:
ant -f build-torque.xml id-table-init-sql
ant -f build-torque.xml insert-sql
4 測(cè)試一下
好了,現(xiàn)在訪問(wèn)數(shù)據(jù)庫(kù)的代碼已經(jīng)自動(dòng)形成了,所有的代碼位于%torque_home%/src/java目錄下,寫(xiě)一個(gè)簡(jiǎn)單的例子測(cè)試一下吧。
[注] 為了使用我們前面已經(jīng)定義的環(huán)境變量設(shè)置,請(qǐng)將%torque_home%/src/java目錄下的所有內(nèi)容拷貝到%torque_home%目錄下。
下面是作者寫(xiě)的一個(gè)測(cè)試用例,它放在%torque_home%目錄下:
//引入相關(guān)包和類 import com.chinacreator.*; import org.apache.torque.Torque; public class Test { public void insert(String s) throws Exception{ //使用Torque.properties配置文件初始化Torque //如果沒(méi)有這一步,你執(zhí)行時(shí)將會(huì)獲得一個(gè)"Torque was not properly initialized"的違例 Torque.init("Torque.properties"); //向Publisher中增加一條新的記錄 Publisher addison = new Publisher(); addison.setName(s); addison.save(); } public static void main(String[] args) throws Exception { Test t = new Test(); t.insert("xj"); } }
4.1 編譯執(zhí)行
請(qǐng)建立一個(gè)build-run.cmd(位于%Torque_home%目錄下)的批處理文件來(lái)編譯和執(zhí)行torque生成的java代碼和自己編寫(xiě)的測(cè)試類,它的內(nèi)容如下:
javac com\chinacreator\*.java javac com\chinacreator\map\*.java javac Test.java java Test
建立好了以后,就可以執(zhí)行這個(gè)批處理文件了。
4.2 查看執(zhí)行結(jié)果
執(zhí)行4.1中建立的那個(gè)批處理文件,然后打開(kāi)數(shù)據(jù)庫(kù),看看publisher表中是否新增加了一條記錄。如果你按照上面的配置和執(zhí)行過(guò)程完全成功的話,你就可以看到publisher表中已經(jīng)有了一條記錄,它的publisher_id是1000,name是xj。
5 優(yōu)點(diǎn)和局限
5.1 優(yōu)點(diǎn)
Torque最大的優(yōu)點(diǎn)就是在java訪問(wèn)數(shù)據(jù)庫(kù)的過(guò)程中,我們可以按照面向?qū)ο蟮牧?xí)慣和方式處理,而且整個(gè)過(guò)程我們不再需要使用任何的Sql語(yǔ)句。如果你喜歡的話,你還可以借助Torque來(lái)幫助您建立數(shù)據(jù)庫(kù)、表和使用它提供的ID自增長(zhǎng)特性,而不需要自己來(lái)處理這些信息。
5.2 局限性
使用Torque可以很方便的實(shí)現(xiàn)訪問(wèn)數(shù)據(jù)庫(kù)的OO實(shí)現(xiàn),但是作者使用了Torque后,發(fā)覺(jué)使用Torque雖然有好處,但是不同的情況下,他的表現(xiàn)還是有很大的差異:
1.如果你的數(shù)據(jù)庫(kù)表結(jié)構(gòu)在項(xiàng)目開(kāi)始時(shí)已經(jīng)設(shè)計(jì)好,不需要中途修改,那么你可以完全的享受Torque帶來(lái)的好處
2.如果你的數(shù)據(jù)庫(kù)表結(jié)構(gòu)在項(xiàng)目進(jìn)行中經(jīng)常需要修改,那么使用Torque就有些局限了,因?yàn)門(mén)orque生成的訪問(wèn)數(shù)據(jù)庫(kù)的java代碼都是靜態(tài)的,如果數(shù)據(jù)庫(kù)表結(jié)構(gòu)發(fā)生了變化,那么需要重新生成訪問(wèn)數(shù)據(jù)庫(kù)的java代碼,而且所有調(diào)用這些代碼的其他應(yīng)用代碼都需要發(fā)生相應(yīng)的改變。這種情況下使用Torque并不適合。
6 總結(jié)
Torque是Apache的公開(kāi)源代碼項(xiàng)目,用于生成訪問(wèn)數(shù)據(jù)庫(kù)的java代碼。這樣使用Torque的人就可以不再需要編寫(xiě)SQL語(yǔ)句來(lái)訪問(wèn)數(shù)據(jù)庫(kù),而是完全使用面向?qū)ο蟮姆绞剑ㄓ蒚orque生成的java代碼)來(lái)訪問(wèn)數(shù)據(jù)庫(kù),而且如果你喜歡,你還可以使用Torque來(lái)協(xié)助您完成建立數(shù)據(jù)庫(kù)、表和相關(guān)的初始化工作。
本文中作者詳細(xì)的介紹了如何配置環(huán)境變量使Torque能夠正常工作,以及如何使用Torque來(lái)生成訪問(wèn)數(shù)據(jù)庫(kù)所需要的資源(java代碼和相關(guān)的SQL語(yǔ)句)、如何使用Torque生成的代碼來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。并且給出了使用MySQL作為目的數(shù)據(jù)庫(kù)的整個(gè)操作過(guò)程,另外給出了使用Microsoft SqlServer作為目的數(shù)據(jù)庫(kù)時(shí)需要注意的一些地方。希望能夠幫助大家了解和掌握Torque的作用機(jī)制、實(shí)現(xiàn)原理和方式,同時(shí)希望大家能夠結(jié)合自己應(yīng)用的情況和Torque的特性合理的抉擇在何種情況下使用Torque,讓Torque能夠助您輕松的實(shí)現(xiàn)數(shù)據(jù)庫(kù)訪問(wèn)。
參考資料
- Torque 幫助 http://db.apache.org/torque/
- Ant 幫助 http://ant.apache.org/
- J2SE1.4.2 http://java.sun.com/j2se/1.4.2/index.jsp
- Ant1.5.1 http://archive.apache.org/dist/ant/binaries/
- Torque http://db.apache.org/builds/torque/release/3.1/
關(guān)于作者
簡(jiǎn)介:肖菁目前是湖南省長(zhǎng)沙鐵道學(xué)院科創(chuàng)計(jì)算機(jī)系統(tǒng)集成有限公司軟件中心軟件工程師,IBM developerworks/BEA dev2dev撰稿人,主要研究J2EE編程技術(shù)、Web Service技術(shù)以及他們?cè)趙ebsphere、weblogic、apache平臺(tái)上的實(shí)現(xiàn),擁有IBM 的 Developing With Websphere Studio證書(shū),個(gè)人網(wǎng)站:http://vivianj.go.nease.net/