1 Torque簡介
Torque是Apache的公開源代碼項目,最開始是Turbine框架的組成部分,后面被獨(dú)立出來作為一個單獨(dú)的組件,歸入了Apache的DB項目下。目前最新的版本是3.3。Torque的主要功能是實現(xiàn)對數(shù)據(jù)庫的訪問,方式是通過生成訪問數(shù)據(jù)庫的資源(包括創(chuàng)建數(shù)據(jù)庫、表和初始化表的sql語句)和java代碼、提供使用這些代碼訪問數(shù)據(jù)庫的運(yùn)行時(runtime)環(huán)境。關(guān)于Torque的詳細(xì)介紹請大家參考http://db.apache.org/torque/。
目前Torque支持的數(shù)據(jù)庫包括mysql、oracle、sqlserver、db2等,還包括對weblogic的數(shù)據(jù)源的支持,詳細(xì)的支持列表大家可以到http://db.apache.org/torque/查找到,你還可以參考http://db.apache.org/torque/db-adapters.html編寫你自己的數(shù)據(jù)庫支持類。
1.1 Torque和傳統(tǒng)數(shù)據(jù)庫訪問方式的差異
下面是兩種方式訪問數(shù)據(jù)庫時的代碼片段,相信大家可以很清晰的感覺到他們之間的差異。
1.1.1 傳統(tǒng)數(shù)據(jù)庫訪問
下面這段代碼實現(xiàn)向數(shù)據(jù)庫中插入一條記錄:
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后我們插入一條記錄的過程:
TableOBJ tableObj = new TableObj();
tableObj.SetFieldName1(fieldvalue1);
tableObj.SetFieldName2(fieldvalue2);
...
tableObj.Save();
下面的章節(jié),作者將詳細(xì)的描述如何配置使用Torque的全過程以及需要注意的內(nèi)容。作者選擇了mysql作為目的數(shù)據(jù)庫進(jìn)行操作(中間有一些內(nèi)容提到了SqlServer,主要是因為使用SqlServer或者其它如oracle、db2等作為目的數(shù)據(jù)庫在某些操作上和使用mysql作為目的數(shù)據(jù)庫有很大的差異,這些地方作者做了特別說明)。
[注] 作者的演示過程使用ant1.5.1和Torque3.1,如果按照作者的過程行不通,請確認(rèn)工具的版本是否正確。
2 環(huán)境配置
2.1 組件下載安裝
為了使用Ant和Torque,你必須下載安裝Sun提供的J2SE,可以到http://java.sun.com下載J2SE的最新版本。
在Torque的使用過程中,很多的工作都是通過ant來完成的,所以你需要先下載ant工具包,由于Torque的build-torque.xml中使用了ant中的option特性,所以最好下載ant1.5.1版本,你可以到http://ant.apache.org/下載最新的ant版本。作者下載后解壓縮到c:/ant(后面章節(jié)將使用%ant_home%來表示這個目錄)目錄中。
然后請下載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),然后解壓縮到同一個目錄中,作者使用了E:\test\torque目錄(后面章節(jié)將使用%Torque_home%來表示這個目錄)。
安裝完成后,請設(shè)置JAVA_HOME環(huán)境變量指向安裝J2SE的目錄,以便各項ant工作能夠順利完成。
2.2 演示例子說明
作者的演示例子使用了一個簡單的數(shù)據(jù)庫,它包括三個表:author, publisher和 book表。Author表保存書的作者信息,publisher表保存書的出版者信息,而book表保存書的相關(guān)信息如title、ISBN信息等。
2.3 修改配置文件
安裝好Torque后,為了讓它成功執(zhí)行,必須配置以下配置文件build.properties、Torque.properties、mybookstore-schema.xml、id-table-schema.xml,下面的章節(jié)詳細(xì)的說明了他們的作用和需要添加的內(nèi)容。
2.3.1 build.properties
build.properties文件中設(shè)置了生成訪問數(shù)據(jù)庫需要的資源文件和java代碼需要用到的環(huán)境變量。下面這段是作者使用mysql數(shù)據(jù)庫時的文件內(nèi)容:
#工程名稱
torque.project = bookstore
#數(shù)據(jù)庫類型
torque.database = mysql
#生成java代碼的包特性
torque.targetPackage = com.chinacreator
torque.database.createUrl = jdbc:mysql://127.0.0.1:3306/mysql
#數(shù)據(jù)庫URL
#注意:數(shù)據(jù)庫名應(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ù)庫驅(qū)動類
torque.database.driver = org.gjt.mm.mysql.Driver
#連接數(shù)據(jù)庫使用的用戶名
torque.database.user = root
#連接數(shù)據(jù)庫使用的密碼
torque.database.password = ioffice
#數(shù)據(jù)庫的主機(jī)IP
torque.database.host = 127.0.0.1
如果使用其它的數(shù)據(jù)庫,那么請修改里面的相關(guān)信息如數(shù)據(jù)庫驅(qū)動類、數(shù)據(jù)庫URL、訪問數(shù)據(jù)庫的用戶名/密碼等,下面是作者使用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
這個配置文件是使用Toorque訪問數(shù)據(jù)庫時初始化環(huán)境需要用到的一些配置內(nèi)容,下面是作者使用MySql作為目的數(shù)據(jù)庫時的配置文件內(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ù)庫連接的時間
torque.defaults.pool.connectionWaitTimeout = 10
# 數(shù)據(jù)庫連接池中的最大連接數(shù)
torque.defaults.pool.defaultMaxConnections = 80
# 數(shù)據(jù)庫連接在連接池中的最大存在時間
torque.defaults.pool.maxExpiryTime = 3600
# 數(shù)據(jù)源的連接驅(qū)動類
torque.defaults.connection.driver = org.gjt.mm.mysql.Driver
# 數(shù)據(jù)源的URL
torque.defaults.connection.url = jdbc:mysql://localhost:3306/bookstore
#訪問數(shù)據(jù)的用戶名和密碼
torque.defaults.connection.user = root
torque.defaults.connection.password = ioffice
#默認(rèn)數(shù)據(jù)庫其中及本文件中剩下的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
這個文件位于%Torque_home%/schema目錄下,文件名中的project應(yīng)該和build.properties中的工程名保持一致,它主要是描述工程中使用的數(shù)據(jù)庫信息,包括數(shù)據(jù)庫、表、字段的特性等。這里應(yīng)該是bookstore-schema.xml,下面的信息是作者使用mysql時對應(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ù)庫以及如何編寫該文檔,請大家參考Torque的幫助文檔或者到Torque的網(wǎng)站(http://db.apache.org/torque/)查詢相關(guān)內(nèi)容
2.3.4 id-table-schema.xml
這個文件用于描述project-schema.xml中相關(guān)ID內(nèi)容的增長特性,它用于指導(dǎo)Torque生成id_table表,他保存了project-schema.xml中相關(guān)ID自動增長的相關(guān)內(nèi)容,實現(xiàn)類似于Oracle中的Sequence的功能。下面是演示實例的對應(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ù)后面的兩個XML文件生成自動建立數(shù)據(jù)庫、表等的相關(guān)的SQL數(shù)據(jù)和訪問該數(shù)據(jù)庫的java代碼。
2.4 類路徑
為了建立使用Torque的相關(guān)環(huán)境,需要將%Torque_home%/lib下面的所有。jar文件,放入classpath中,其他需要加入classpath中的還包括%Torque_home%,%Torque_home%/templates,還有支持訪問數(shù)據(jù)庫的jdbc驅(qū)動的.jar文件。
3 生成訪問資源
3.1 生成訪問數(shù)據(jù)庫的資源
1.生成訪問數(shù)據(jù)庫的java代碼
您可以使用下面的操作來生成訪問數(shù)據(jù)庫的java代碼:
ant -f build-torque.xml
這個操作將順帶產(chǎn)生生成數(shù)據(jù)庫、表等的相關(guān)SQL語句。
2.自動生成數(shù)據(jù)庫
使用Ant來執(zhí)行下面的代碼,他會幫您自動建立數(shù)據(jù)庫:
ant -f build-torque.xml create-db
[注] 如果是使用Microsoft SqlServer,因為Torque中目前還沒有支持創(chuàng)建數(shù)據(jù)庫的相關(guān)SQL代碼實現(xiàn),所以需要自己手工建立相對應(yīng)的數(shù)據(jù)庫。
3.自動生成相關(guān)表
使用Ant來執(zhí)行下面的代碼,他會幫您自動建立數(shù)據(jù)表和一些初始數(shù)據(jù)內(nèi)容:
ant -f build-torque.xml id-table-init-sql
ant -f build-torque.xml insert-sql
4 測試一下
好了,現(xiàn)在訪問數(shù)據(jù)庫的代碼已經(jīng)自動形成了,所有的代碼位于%torque_home%/src/java目錄下,寫一個簡單的例子測試一下吧。
[注] 為了使用我們前面已經(jīng)定義的環(huán)境變量設(shè)置,請將%torque_home%/src/java目錄下的所有內(nèi)容拷貝到%torque_home%目錄下。
下面是作者寫的一個測試用例,它放在%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
//如果沒有這一步,你執(zhí)行時將會獲得一個"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í)行
請建立一個build-run.cmd(位于%Torque_home%目錄下)的批處理文件來編譯和執(zhí)行torque生成的java代碼和自己編寫的測試類,它的內(nèi)容如下:
javac com\chinacreator\*.java
javac com\chinacreator\map\*.java
javac Test.java
java Test
建立好了以后,就可以執(zhí)行這個批處理文件了。
4.2 查看執(zhí)行結(jié)果
執(zhí)行4.1中建立的那個批處理文件,然后打開數(shù)據(jù)庫,看看publisher表中是否新增加了一條記錄。如果你按照上面的配置和執(zhí)行過程完全成功的話,你就可以看到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訪問數(shù)據(jù)庫的過程中,我們可以按照面向?qū)ο蟮牧?xí)慣和方式處理,而且整個過程我們不再需要使用任何的Sql語句。如果你喜歡的話,你還可以借助Torque來幫助您建立數(shù)據(jù)庫、表和使用它提供的ID自增長特性,而不需要自己來處理這些信息。
5.2 局限性
使用Torque可以很方便的實現(xiàn)訪問數(shù)據(jù)庫的OO實現(xiàn),但是作者使用了Torque后,發(fā)覺使用Torque雖然有好處,但是不同的情況下,他的表現(xiàn)還是有很大的差異:
1.如果你的數(shù)據(jù)庫表結(jié)構(gòu)在項目開始時已經(jīng)設(shè)計好,不需要中途修改,那么你可以完全的享受Torque帶來的好處
2.如果你的數(shù)據(jù)庫表結(jié)構(gòu)在項目進(jìn)行中經(jīng)常需要修改,那么使用Torque就有些局限了,因為Torque生成的訪問數(shù)據(jù)庫的java代碼都是靜態(tài)的,如果數(shù)據(jù)庫表結(jié)構(gòu)發(fā)生了變化,那么需要重新生成訪問數(shù)據(jù)庫的java代碼,而且所有調(diào)用這些代碼的其他應(yīng)用代碼都需要發(fā)生相應(yīng)的改變。這種情況下使用Torque并不適合。
6 總結(jié)
Torque是Apache的公開源代碼項目,用于生成訪問數(shù)據(jù)庫的java代碼。這樣使用Torque的人就可以不再需要編寫SQL語句來訪問數(shù)據(jù)庫,而是完全使用面向?qū)ο蟮姆绞剑ㄓ蒚orque生成的java代碼)來訪問數(shù)據(jù)庫,而且如果你喜歡,你還可以使用Torque來協(xié)助您完成建立數(shù)據(jù)庫、表和相關(guān)的初始化工作。
本文中作者詳細(xì)的介紹了如何配置環(huán)境變量使Torque能夠正常工作,以及如何使用Torque來生成訪問數(shù)據(jù)庫所需要的資源(java代碼和相關(guān)的SQL語句)、如何使用Torque生成的代碼來訪問數(shù)據(jù)庫。并且給出了使用MySQL作為目的數(shù)據(jù)庫的整個操作過程,另外給出了使用Microsoft SqlServer作為目的數(shù)據(jù)庫時需要注意的一些地方。希望能夠幫助大家了解和掌握Torque的作用機(jī)制、實現(xiàn)原理和方式,同時希望大家能夠結(jié)合自己應(yīng)用的情況和Torque的特性合理的抉擇在何種情況下使用Torque,讓Torque能夠助您輕松的實現(xiàn)數(shù)據(jù)庫訪問。
參考資料
關(guān)于作者
簡介:肖菁目前是湖南省長沙鐵道學(xué)院科創(chuàng)計算機(jī)系統(tǒng)集成有限公司軟件中心軟件工程師,IBM developerworks/BEA dev2dev撰稿人,主要研究J2EE編程技術(shù)、Web Service技術(shù)以及他們在websphere、weblogic、apache平臺上的實現(xiàn),擁有IBM 的 Developing With Websphere Studio證書,個人網(wǎng)站:http://vivianj.go.nease.net/