没办法,文章超过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与他取得联系。