没办法,文章超过64k。只好分割,希望大家见谅
1. 自定义数据的格式
日期类型在不同的数据库中的sql格式不太一样,为了解决这个问题,我们可以使用自定义的对象实现Format来做到这一点。在此以String为例,展示Format的应用:
class StringFormat2 implements Format{
public String name(){
return "DB_STRING2";
}
public String format( String data){
return "'"+data+":'";
}
}
……
Connection conn= ConnectionFactory.getConnectionByParams(
"org.gjt.mm.mysql.Driver",
"jdbc:mysql://localhost/dbformstest", "sa", "");
DbCommand cmd= new DbCommand( conn);
//自动获取元数据(当然也可手动添加)
DataSet ds= cmd.query("select * from service where 1=2");
//设置更改条件
String[] conditions= {" id= 100"};
String[][] data1= {{"301", "dog walking", "talking the dog for a walk"}};
//设置表名
ds.getMetaData().setTableName("service");
//设置最后一列的数据格式
ds.getMetaData().getColumnMetaData( 2).setFormat( new StringFormat2());
//设置数据
ds.setData( data1);
cmd.update( ds, conditions);
conn.close();
使用存储过程
虽然存储过程不利于程序的移植,但是在实际的应用中仍然还是无法回避它。工具包中也提供了对于调用存储过程的支持。存储过程对象UML图:
DbSpParameter、DbStoredProcess的形式与DataSet及各组成部分非常类似,在此只给出具体的应用。
Connection conn= ConnectionFactory.getConnectionByParams(
"org.gjt.mm.mysql.Driver",
"jdbc:mysql://localhost/dbformstest", "sa", "");
DbCommand cmd= new DbCommand( conn);
DbStoredProcess sp= new DbStoredProcess();
sp.setName("sp1");
DbSpParameter param1= new StringParameter();
param1.setValue("Tod");
DbSpParameter param2= new NumbericParameter();
param2.setValue("123.4");
DbSpParameter param3= new DateTimeParameter();
param3.setValue("2001-11-11");
sp.add( param1);
sp.add( param2);
sp.add( param3);
cmd.callStoredProcess( sp);
conn.close();
浏览数据
浏览数据是数据库应用,尤其是web数据库应用程序最常见的要求。在web环境中不可能一次性返回大量的数据(因为这样消耗服务器内存极大),通常数据是以页的形式组织,每页含有若干数据,一次请求只返回一页。
在工具包中这部分功能由DbReader来完成,主要功能:
² 支持分页,允许指定每页记录数;
² 实现了Iterator接口,允许使用者遍历数据;
² 实现了first、prev、after、last方法;
² 允许用户指定页号,快速定位;
应用举例
Connection conn= ConnectionFactory.getConnectionByParams(
"org.gjt.mm.mysql.Driver",
"jdbc:mysql://localhost/dbformstest", "sa", "");
//设置每页显示5条数据
DbReader dr= DbReader.createInstance( conn, 5);
//查询
dr.query( "select id, name from service");
//浏览
while( dr.hasNext()){
DataSet ds= (DataSet)dr.next();
System.out.print( ds.toString());
}
conn.close();
格式输出
获取数据,并转换成指定格式,这是数据库开发应用中最常见的功能。在工具包中,目前支持的有XML、CSV。这部分功能由DbUtil来完成。对于XML,目前支持的格式非常简单,缺少对DTD的支持。其形式如下:
<dataset>
<row>
<列名>
数据
</列名>
</row>
</dataset>
应用举例
DbCommand com= new DbCommand( conn);
DataSet ds= com.query( "select * from t_jc_dwlb");
DbUtil.getXML( ds, "GB2312");
结束语
本文给出了一个自定义工具包的设计、应用举例。需要提醒注意的是,工具包的目的并非要替代JDBC的使用,而只是简化它的使用。由于笔者深受C++STL的“容器算法相分离”思想的影响,在设计的时候也不知不觉地采用了这套思想。或许,还有更好的实现方式,希望读者能给笔者一些建议。
整个工具包的UML图如下:
工具包实现、测试的环境:
² jdk1.4.1;
² MySQL 4.01;
² Oracle8i;(其中816的驱动对中文支持在滚动结果集时有问题,请换817的驱动)
² DB2;
参考资料
Design patterns,一部划时代的作品,前人经验的总结,OO实际应用的好书;
Patterns of Enterprise Application Architecture,Martin Fowler的最新作品,全面介绍企业开发
中常用的模式
关于作者
胡键,西安交通大学工学硕士,热衷于j2ee/.net技术,是OpenSource的忠实拥护者。目前与友人创建西安烁程软件有限公司。公司主要致力于java web应用的开发,已有多个项目在能源、电力和交通行业得到应用。可以通过james.hu@chinacodeline.com与他取得联系。