admin 管理员组

文章数量: 1184232


2024年3月7日发(作者:车铣复合编程教程)

Torque的应用总结

文章摘要

Torque项目是Apache的公开源代码ORM(Object-Relational Mapping)工具,主要用于生成访问数据库的资源和java代码、提供使用这些代码访问数据库的运行时(runtime)环境。通过使用Torque,你可以使用面向对象方式访问数据库,不再需要编写任何SQL语句,对于我们快速进行项目开发起到了至关重要的作用。

关键词

Torque 访问 数据库 配置 应用 心得

正文

在开发软件的时,我们免不了要和数据库打交道,而且不同的项目所采用的数据库类型还不同,有IBM DB2,Oracle,MS SQL,My SQL等等,开发过程中主要就是对数据的存取(增、删、改、查询)。为了隔离业务逻辑和数据存取,充分体现MVC模式的优势,在开发时我们采经常用第三方ORM工具,比如Torque,Hibernate,JDO,用它作为业务逻辑层与数据库层的接口。

我参与的几个项目中使用的ORM工具多数是Torque,在开发使用过程中遇到了一些问题,和同事们讨论了很多,有了一点心得体会,就形成了下面的笔记(请各位先掌握Torque基本的编程知识)。

Torque配置方面

1, (1)牵涉到ectColumn的问题时,只能用ct(crit),而不能用相关类对应的ct(crit)方法,返回的是Record List;

(2)如果对String类型的字段进行排序cendColumn(unm),生成的sql查询的select语句中会多一列"Select UPPER(unm)",但还是可以用ct(crit);

(3)要单独处理某一记录的某一字段时,需要先将ct(crit).get(0)强制转化成Record类型,再调用getValue(i)得到Value类型的变量,再将其转化成相应的数据类型(调用asInt(),asString()等等方法),注意i是从"1"开始的;

2, 关于何时用BasePeer,何时用本类的Peer的结论:

(1)当涉及到函数(比如Count,Max,Min)时,只能用BasePeer;

(2)当涉及addSelectColumn(*)时,只能用BasePeer;

(3)当涉及取整条记录(包括所有字段)时,最好用本类的Peer,因为可以返回TblObj List;

3, 本类的Peer中有很多有用的工具方法,比如取"1对n"关系对象,将Record和TblObject相互转化等等,可以大量减少我们的代码量;

4, 利用Torque多建视图vPeer(尤其是表与表之间关系复杂时),视图vPeer只负责查询操作,而原来的本类的Peer就只负责增删改操作了;将Torque生成的SQL语句修改成建视图的SQL语句,投机取巧;

5,在写时,如果表与表之间存在"一对一"或者是"多对多"关系,外键的配置还是要尽量写好的,ant生成建表的SQL后再把外键相关的SQL去掉,这样即能保持Torque自动生成的简单好用的工具方法,又不影响数据库的使用.工具方法的代码例子如下:

List userList = Users(crit,conn);

TblLevel level = Level()l;//大量减少了代码量

这时Torque默认是“lazy”模式,就是说当第一次去取子类list时Torque才查询数据库形成List放于内存中。

6,关于字段变量名称命名规则:一律小写,不要下滑线。比如:

再配置,这样生成的java类就符合标准的JavaBean规范了,更便于我们使用RunData类和其它第三方工具类。

7,在进行db-配置时,如果碰到某些不清楚的选项,比如

type="VARCHAR">中的属性有哪些值,可以查看/turbine/dtd/ 文件。如果想进一步了解各种字段配置的类型,比如“LONGVARCHAR”,再不同数据库中对应哪些数据类型,就可以查看和修改“D:”这个配置文件了。

8,在进行Linux+DB2+Torque+Tomcat+JNDI配置时,要注意一些jar包的冲突,比如,这是因为Torque和Tomcat的lib下都有相应的jndi包,但是版本又不同;还要注意Linux中DB2默认是jcc驱动服务,但是Torque目前只支持net和app驱动,所以要先打开DB2的net驱动服务,只要在Linux DB2实例用户中执行“#/db2/bin/db2jstrt

6789” 就可以启动Java DB2 JDBC Applet服务器,指定端口为6789,就可以用net驱动了。

9,Torque中配置Tomcat中的Jndi步骤如下:

(1)配置ties,将"## Using jndi"下面的四行打开;其它的不能打开;注意"Path"要写成全名("java:com/env/jdbc/course"),比如:

## Using jndi

y=taSourceFactory

=java:com/env/jdbc/bookstore

l =

LContextFactory

=

(2)配置Tomcat/conf/,添加;

(3)配置/WEB-INF/,添加;

10,Torque3.0+JNDI+Oracle9i+WebSphere5.1配置:

(1)webshpere中oracle驱动采用Oracle Jdbc Driver(或XA的);将驱动拷贝到websphere;

(2)websphere中Jndi Name命名为"jdbc/course";

(3)若直接采用jdbc编程调用websphere中的jndi获取连接conn时,只需lookup("jdbc/course");而不必用全名("java:com/env/jdbc/course");

(4)Torque中调用websphere中的Jndi时,只是要打开"##Using JNDI"下的两句配置:

y=taSourceFactory

=jdbc/bookstore(注意path中没有"java:com/env/")

(5)中也不需要配置。

11, Torque使用流程模式: PowerDesigner(ERWin)进行数据建模,然后再生成物理数据库,然后用torque-gen-3.1执行扫描任务ant jdbc,生成和*.java;(torque-gen-3.1和torque-3.1不一样)

首先在ties中配置好数据库链接参数

然后 ant -f

再进入工程目录 修改 ties

再 ant -f jdbc

修定文件

再ant -f om

再ant -f compile

Torque编程方面

1、直接运行SQL语句

//要用eQuery(sqlStr)

int recRightCount = ((Record) eQuery("select count(*) as rightCount from

tbluser_right_def").get(0)).getValue(1).asInt();

List list = eQuery(strSQL) ;

2、事务操作

//mysql中的数据表的类型默认是MYISAM,要改为InnoDB类型才支持事务操作

conn = (aultDB());

当一个事务中又要求进行多次查询操作,尤其是有for的时候,一定要把conn传入查询方法中,如ct(crit,conn);否则数据库会死锁的。

3、排序

cendingOrderByColumn(_TIME);

endingOrderByColumn();

4、组合SQL语句

//设置 查询条件

(,new

Integer(ToStatus(12)),R_EQUAL);

//组合复杂的SQL,多条件判断

terion().and(Criterion(,new Integer(ToStatus(13)),_THAN));

terion().and(Criterion( ,(Object)strObject,));

(,(Object) " not in (select id from TblCategory where

id <> '11')",);(注意crit中的条件String中要带上字段ID的)

(_NAME, searchField, (Object) ("%" + searchCriteria + "%"),

);

terion(_NAME, searchField).setIgnoreCase(true);

(注意: For PostgreSQL this will use ILIKE, for other databases it will use the SQL upper()

function on the column and search string (for Oracle you may want to define a function index to

make this efficient).)

//组成简单的关联查询SQL,两边都是字段:TBLPRO_=TBLPRO_

n(,);

n(,);

//ct(crit)之前选择要输出的字段

ectColumn(TA);

ectColumn();

5、Record向ObjBean对象实例转化

//先用BasePeer获得List(Records)

List list = ct(crit);

Record record = (Record)(0);

//单个record对象转化成objBean

TblObj obj = null;

Obj = teObject(record,1,new TblObj());//offset是从第一个字段开始算的

// Obj = 2Object(record,1, );//这样也可以,它调用populateObject

//List records转化成List objBeans

list = teObjects(list);

6、不规则(不能转化成单个ObjBean)Record向RunData对象实例转化

//单个record对象转化成rd

RunData rd = tance(record);//因为rd中存放了一个Record对象实例

//List records转化成List rds

list = ListToRundataList(list);

7、Torque的newObj = ()方法不行,有时候会死循环,只能重载了

8、Torque中注意: ct(crit,conn)中conn可以为null,但是te(crit,conn)中conn可以不能为null,比如:

//执行操作

ct(whereCrit,null);

if(null != conn){

te(whereCrit, setCrit, conn);

}else{

te(whereCrit, setCrit);

}

9、Torque中的TblObject类的getXXX()方法不要随便重载,如果要求重载必须写成getXXX(int flag);其中flag是一个标记虚的参数,实际无用;因为TblObjectPeer中的buildCriteria()用到了这些getXXX();


本文标签: 数据库 使用 类型 配置 生成