UML软件工程组织

使用Torque访问数据库
作者: 肖菁 来自:sun公司

文章摘要

Torque项目是Apache的公开源代码项目,主要用于生成访问数据库的资源和java代码、提供使用这些代码访问数据库的运行时(runtime)环境。通过使用Torque,你可以使用面向对象方式访问数据库,不再需要编写任何SQL语句。本文中给大家详细的介绍了如何使用Torque框架访问数据库的整个过程,希望能够指导大家熟练使用Torque

关键词

Torque  访问  数据库

1  Torque简介

TorqueApache的公开源代码项目,最开始是Turbine框架的组成部分,后面被独立出来作为一个单独的组件,归入了ApacheDB项目下。目前最新的版本是3.1Torque的主要功能是实现对数据库的访问,方式是通过生成访问数据库的资源(包括创建数据库、表和初始化表的sql语句)和java代码、提供使用这些代码访问数据库的运行时(runtime)环境。关于Torque的详细介绍请大家参考http://db.apache.org/torque/

目前Torque支持的数据库包括mysqloraclesqlserverdb2等,还包括对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(urluseridpwd);
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.SetFieldName1fieldvalue1);
tableObj.SetFieldName2fieldvalue2);
...
tableObj.Save();

下面的章节,作者将详细的描述如何配置使用Torque的全过程以及需要注意的内容。作者选择了mysql作为目的数据库进行操作(中间有一些内容提到了SqlServer,主要是因为使用SqlServer或者其它如oracledb2等作为目的数据库在某些操作上和使用mysql作为目的数据库有很大的差异,这些地方作者做了特别说明)。

[注] 作者的演示过程使用ant1.5.1Torque3.1,如果按照作者的过程行不通,请确认工具的版本是否正确。

2  环境配置

2.1  组件下载安装

为了使用AntTorque,你必须下载安装Sun提供的J2SE,可以到http://java.sun.com下载J2SE的最新版本。

Torque的使用过程中,很多的工作都是通过ant来完成的,所以你需要先下载ant工具包,由于Torquebuild-torque.xml中使用了ant中的option特性,所以最好下载ant1.5.1版本,你可以到http://ant.apache.org/下载最新的ant版本。作者下载后解压缩到c:/ant(后面章节将使用%ant_home%来表示这个目录)目录中。

然后请下载Torque3.1版本(包括http://db.apache.org/builds/torque/release/3.1/torque-3.1.ziphttp://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保存书的相关信息如titleISBN信息等。

2.3  修改配置文件

安装好Torque后,为了让它成功执行,必须配置以下配置文件build.propertiesTorque.propertiesmybookstore-schema.xmlid-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_id1000,namexj

5  优点和局限

5.1  优点

Torque最大的优点就是在java访问数据库的过程中,我们可以按照面向对象的习惯和方式处理,而且整个过程我们不再需要使用任何的Sql语句。如果你喜欢的话,你还可以借助Torque来帮助您建立数据库、表和使用它提供的ID自增长特性,而不需要自己来处理这些信息。

5.2  局限性

使用Torque可以很方便的实现访问数据库的OO实现,但是作者使用了Torque后,发觉使用Torque虽然有好处,但是不同的情况下,他的表现还是有很大的差异:

1.如果你的数据库表结构在项目开始时已经设计好,不需要中途修改,那么你可以完全的享受Torque带来的好处

2.如果你的数据库表结构在项目进行中经常需要修改,那么使用Torque就有些局限了,因为Torque生成的访问数据库的java代码都是静态的,如果数据库表结构发生了变化,那么需要重新生成访问数据库的java代码,而且所有调用这些代码的其他应用代码都需要发生相应的改变。这种情况下使用Torque并不适合。

6  总结

TorqueApache的公开源代码项目,用于生成访问数据库的java代码。这样使用Torque的人就可以不再需要编写SQL语句来访问数据库,而是完全使用面向对象的方式(由Torque生成的java代码)来访问数据库,而且如果你喜欢,你还可以使用Torque来协助您完成建立数据库、表和相关的初始化工作。

本文中作者详细的介绍了如何配置环境变量使Torque能够正常工作,以及如何使用Torque来生成访问数据库所需要的资源(java代码和相关的SQL语句)、如何使用Torque生成的代码来访问数据库。并且给出了使用MySQL作为目的数据库的整个操作过程,另外给出了使用Microsoft SqlServer作为目的数据库时需要注意的一些地方。希望能够帮助大家了解和掌握Torque的作用机制、实现原理和方式,同时希望大家能够结合自己应用的情况和Torque的特性合理的抉择在何种情况下使用Torque,让Torque能够助您轻松的实现数据库访问。

参考资料

§                   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/

关于作者

简介:肖菁目前是湖南省长沙铁道学院科创计算机系统集成有限公司软件中心软件工程师,IBM developerworksBEA dev2dev撰稿人,主要研究J2EE编程技术、Web Service技术以及他们在websphereweblogicapache平台上的实现,拥有IBM Developing With Websphere Studio证书,个人网站:http://vivianj.go.nease.net/


版权所有:UML软件工程组织