简化JDBC的使用(2)

类别:Java 点击:0 评论:0 推荐:

没办法,文章超过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应用的开发,已有多个项目在能源、电力和交通行业得到应用。可以通过[email protected]与他取得联系。

本文地址:http://com.8s8s.com/it/it16733.htm