JAVA—咖啡馆

——欢迎访问rogerfan的博客,常来《JAVA——咖啡馆》坐坐,喝杯浓香的咖啡,彼此探讨一下JAVA技术,交流工作经验,分享JAVA带来的快乐!本网站部分转载文章,如果有版权问题请与我联系。

BlogJava 首页 新随笔 联系 聚合 管理
  447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks
1.        Torque
Torque是一个持久框架,也是jakarta的一个子目,原来包括在Turbine框架中,从Turbine2.2Torque被分离出来作一个独的子目。目前最高版本是3.3
2.        持久以及持久框架的理解
持久就是在整个系中与持久存储Database,LDAP Server,XML等打交道的部分。持久框架的作用就是使持久层访问持久介更加方便。如果是访问Database而建立的持久框架那就又有一个O/R Mapping的概念。O/R Mapping就是建立(Object)系数据(R)中的表(不一定是一)的映射。Torque就是这样起到O/R Mapping作用的持久框架。他使java程序可以方便地通操作普通java象的方式来访问数据,甚至不用了解数据的相(最好是了解),另一个好是屏蔽数据库类型即可任意更持久框架支持的Database
3.        Torque的工作原理
   一般在利用O/R Mapping框架开发候,有三个基本的元即系数据中的表(Table)Java中的持久(PO),POTable映射的xml文件(Schema)
   首先,Torque包含一个generator用来根据由开发者配置好的Schema来自生成POTable就意味着开发者只要定SchemaPOTable就可以自生成了。
   在生成好的POTable以后,开发者就可以利用POTable访问了。了达到个目的Torque提供了一个运行时环境来保的正确运行。在工程中引入了torque.jar就可以个运行境了。
4.        Torque中的包,和接口
Torque的源提供的是运行境,基于Torque开发关心的是生成的PO的使用方法即怎使用生成的PO来操作Table。下面会通Torque学上的例子来详细说明。
5.        学中的例子
5.1利用generator生成POTable
首先,要通generator来生成POTable要定Schemagenerator的配置。
 Schema的定如下:
<?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="torque"
 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" onDelete="cascade">
      <reference
        local="publisher_id"
        foreign="publisher_id"/>
    </foreign-key>
    <foreign-key foreignTable="author" onDelete="cascade">
      <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>
  schema里定Table构,生成的PO在会按照一定规则Table对应
然后修改build.properties文件加入如下部分:
torque.database = mysql
torque.project = torque
torque.addGetByNameMethod = true
torque.addIntakeRetrievable = false
torque.addSaveMethod = true
torque.addTimeStamp = true
torque.basePrefix = Base
torque.complexObjectModel = true
torque.useClasspath = false
torque.useManagers = false
 
torque.targetPackage=org.together.om
torque.database.createUrl = jdbc:mysql://127.0.0.1/mysql
torque.database.buildUrl = jdbc:mysql://127.0.0.1/torque
torque.database.url = jdbc:mysql://127.0.0.1/torque
torque.database.driver = org.gjt.mm.mysql.Driver
torque.database.user = root
torque.database.password = haohao
torque.database.host = 127.0.0.1
torque.sameJavaName = false
关键绿标记的部分,表明是接的mysql数据,并将生成的PO放到org.together.om包中。   最后利用antgenerator这样就可以在数据中生成相Table,并生成于Table对应PO(放在定好的org.together.om)。拿schema中定Author例,运行generator后可以在mysql数据中生成一Author表,DDL如下:
CREATE TABLE `author` (
 `author_id` int(11) NOT NULL default '0',
 `first_name` varchar(128) NOT NULL default '',
 `last_name` varchar(128) NOT NULL default '',
 PRIMARY KEY (`author_id`)
) TYPE=MyISAM
org.together.om包下会有一个BaseAuthor(由于生成的PO多在下面会详细)中会有如下的属性与Table中的字段对应
/** The value for the authorId field */
    private int authorId;     
    /** The value for the firstName field */
    private String firstName;
    /** The value for the lastName field */
    private String lastName;
5.2    generator生成的PO
 在org.together.om下有若干类和一个子包map。map包下的也是运行环境相关的不用考虑。在org.together.om下会为schema中定义的每一个表生成四个相关的类。拿Book来说,有四个类和他对应,分别为:BaseAuthorPeer, AuthorPeer,BaseAuthor, Author。BaseAuthorPeer和BaseAuthor分别是AuthorPeer和Author的基类,在基类里是由generator生成的代码,注意不要修改基类的代码,因为每次利用generator生成时都会覆盖基类的代码(AuthorPeer和Author类不会被覆盖)。
5.3 PO的使用方法
 BaseAuthorPeer和BaseAuthor这两个基类是用来提供底层功能的,我们只要操作AuthorPeer和Author类就可以完成对数据库中的表author的操作如增加,删除,更新和查询等。
 对author进行增加操作的代码如下:
 Author na = new Author();
 na.setFirstName("a");
 na.setLastName("b");
 na.save();  // 或用AuthorPeer的静态方法替代AuthorPeer.doInsert(na);
 对author进行更新操作的代码如下:
na.setLastName("c");
na.save(); //或用AuthorPeer的静态方法替代AuthorPeer.doUpdate(na);
对author进行删除操作的代码如下:
AuthorPeer.doDelete(na); //进行delete时只能使用AuthorPeer的静态方法
对author进行查询,查询出author表中的author_id字段的值在1和10000之间的所有数据
Criteria testCriteria = new Criteria();
testCriteria.add(AuthorPeer.AUTHOR_ID,1,Criteria.GREATER_THAN);            testCriteria.add(AuthorPeer.AUTHOR_ID,10000,Criteria.LESS_THAN);
List tList = AuthorPeer.doSelect(testCriteria);
log.debug("all size:" + tList.size());
for (int i = 0; i < tList.size(); i++) {
 Author o = (Author) tList.get(i);
 System.out.println("Author" + i + " : " + o.toString());
}
以上介绍了PO的基本用法,在实际的应用中往往比上述要复杂的多,但是掌握了基本的方法,其他的用法就可以在实际使用时查看手册即可。Torque的doc上附带的Toturial上面有使用generator的详细说明和怎样使用Torque进行开发的例子。
6.        TorqueACI中的应用
看了一下ACI的源码,torque自动生成的部分没有任何改动,即都是直接使用生成的PO。但在TorqueACIStorage.java中关于Torque的用法要比上述的例子中多了一个事务处理情况,以下给出使用Torque进行事务处理的例子。
//创建JDBC连接用于控制事务
java.sql.Connection conn = null;
try{
   //开始事务
conn=Transaction.begin(BaseAuthorPeer.getMapBuilder().getDatabaseMap().getName());
Author ta = new Author();
ta.setFirstName("t");
ta.setLastName("t");
AuthorPeer.doInsert(ta,conn);
//String ab = null; //人为制造异常使事务回滚
//ab.toLowerCase();
Publisher tp = new Publisher();
tp.setName("t");
PublisherPeer.doInsert(tp,conn);
//提交事务,会自动释放连接
Transaction.commit(conn);
} catch (Exception ex) {
//回滚事务
 Transaction.safeRollback(conn);
 log.error(ex);
}
ACI中也有一些复杂一点的查询条件(Criteria)的构造,在Torquedocs中的criteria-howto.html文件中都应该能够找到。
posted on 2008-05-22 11:29 rogerfan 阅读(1029) 评论(0)  编辑  收藏 所属分类: 【Torque学习】

只有注册用户登录后才能发表评论。


网站导航: