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