第一个问题:rowset
查看jdk1.4 api文档,你可以看到很详细的说明。我在这里说一些个人理解:
rowset是javax.sql.*这个包中的接口,而resultset或者是statement等都是标准的java.sql.*包中定义的接口,因而可以看出rowset应该是标准jdbc接口的一些补充。从其继承关系看,rowset接口继承自resultset,从使用的角度看,从api文档可以看出,rowset的出现是为了java bean而设计的。javabean是java组件式开发的组成部分,如果你用过windows平台的快速开发工具开发过的话,你会理解什么是组件式开发。rowset的功能跟delphi中的数据组件很类似,本身可以维护数据库连接,有更新功能,可以供开发时实时连接到数据库中进行设计,也可以断开连接,必要时再连上。可以说rowset比java.sql.*包中提供的功能更加丰富,是jdbc驱动的更上一层的接口,是用来规范各个java bean提供商创建相应的bean时共同遵循的接口。因此,在做比较底层开发的时候,不适合使用rowset.在执行sql语句的时候,rowset应该是调用了底层的驱动接口(象statement)来完成,没有太大区别。第二个问题:
connection当中没有getStatement这个方法,有preparedstatement这个方法,createStatement返回的是Statement接口,preparedstatement返回的是PreparedStatment接口,后者继承自前者,由于PreparedStatement使用了precompile,因而执行sql语句更高效,所谓的高效就是在sql语句解析执行时,速度更快。建议使用preparedstatement.第三个问题:
class.forname是检测类是否已经安装,或者说是注册,也就是说当前类路径里能否找到该类,同时也起到显式加载jdbc驱动的作用,以给drivermanager在进行驱动查找时找到合适的驱动联系到数据库当中,因此可在程序中先用class.forname来先对驱动进行加载。
在java api文档里头,提到datasource是优先采用的数据库连接方式。datasource是一种工厂类型的数据库连接方式,实现了这类接口的数据库驱动在运行中通过jndi来注册,调用方可以通过jndi名来查找以获得对数据库的连接。这种工厂方式跟drivermanager有很大的不同,如上面所说的jndi名注册与查找,还可以支持连接池来提高连接效率,并可给中间件服务器提供事务控制,另外就是获得独立性,因为是通过命名来获得连接,所以调用时不用知道使用了那种驱动来连接,或者连接到什么数据库,当要连接数据库类型变化的时候,可以在配置当中更改驱动和url连接字串即可,给编程带来很大的独立性,也给实际的数据库连接带来很大的灵活性。j2ee开发就是使用了这种先进的方式。

解决方案 »

  1.   

    to jxspace(彼黍离离) :万分感谢你的回答 :),不过,因为我实在是太菜了,所以还是有点不太明白:“在做比较底层开发的时候,不适合使用rowset”,那什么样的开发算是底层呢?为什么呢?因为我参与过的项目开发实在是少的可怜,所以没什么这方面的经验。在我看来似乎使用rowset和statement的区别还是不很明显,反而rowset要比statement功能要强。那如果我的程序只使用rowset会有什么问题么?
      

  2.   

    三:JDBC的连接问题,JDBC有两种连接方式,一种就是用Class.forName(driver);
    Connection conn=DriverManager.getConnection(url,"sa","");
     还有种是通过datasource来连接,两者有什么区别啊
    用Datasource连接一般采用数据库连接池技术~~~他只是通过DataSource得到本来就存在的一个数据库连接而已,而Connection conn=DriverManager.getConnection(url,"sa","");他要每次都去连接一次数据库~~相对来说比通过Connection pool要慢些~~~
      

  3.   

    以下是sun网站上的一篇tutorial文章的大意翻译片断及一些理解:RowSets使网络间表格数据传输变得简单,也可以提供滚动结果集或者更新结果集,即使底层的jdbc驱动并没有对这些功能提供支持。... Rowsets有很多种变体(也就是提供不同场景下的不同类型rowset)...rowset对象包含从一个result set的行集合,或者一些来源于其他资源的表格数据,比如文件、spreadsheet。由于rowset遵循了javabean模式,提供了属性和事件触发,因此可以在应用程序中跟其他组件集成...rowset的实现分为两大类,连接与非连接rowset,非连接rowset为了填充自身数据或者是提交数据更改,可以连接到数据源,但大多时候保持断开状态。在断开状态,rowset不需要jdbc驱动或者是全部的jdbc api,因此属于轻量级,是一个将数据从网络传送到瘦客户的理想组件。...断开的rowset将数据缓存在内存中,它需要维护如所包含的字段列、内部状态信息等等元数据,它也可以创建连接,来执行执行sql命令,从数据源读写数据。连接的rowset则必须从生命期开始即保持跟数据库的连接。以下是rowset的几种可能存在的实现方式:
    1. CachedRowSet类:非连接类型rowset,不适合于较大量的数据集,适用于PDA或者网络计算机。
    2. JDBCRowSet:连接型rowset,主要对ResultSet进行羽量及wrapper,使jdbc驱动可以象javabeans那样来使用。
    3. WebRowSet:连接型rowset,基于http协议来访问提供数据获取渠道的servlet,使瘦的web客户端可以获取与更新数据。Rowset可以在这些场合来使用:
    1.两层CS, 客户端的Rowset可以直接连接到数据库进行操作。
    2.三层:
    Intranet内部,rowset1运行在客户端的一个application,客户端访问ejb服务器,通过一个ejb来获得一个rowset2,rowset2被序列化返回到客户端,在客户端被解析还原,赋给rowset1,这时候,尽管rowset1没有连接数据库,但是可以工作在断开的状态,这时候rowset1就相当于一个本地数据容器,可以进行前端数据操作。
    Internet: 如上面提到的一种可能实现方式WebRowSet,但其如何访问servlet,具体的工作方式,估计sun也没有很多具体的描述。总结:
    1.RowSet首先是一个javabean组件,提供了跟其他javabean协同工作的机制,比如,假设有一个JGridBean可以用RowSet来集成表述数据,前者作为数据敏感bean组件,后者提供数据源。
    2.RowSet与jdbc driver和jdbc api分离,使其变为轻量级,其可断开的特性,及java bean所拥有的组合性,使得在多层环境下非常适合于做前端表述组件。
    3.轻量级使网络传输变得简单且有效。
    因而,虽然同样是jdbc的api, 但是RowSet跟ResultSet的实现和应用是完全不同层次,前者的实现依赖于底层的api实现,应用中侧重于合理有效的数据表述与传输,由于提供了属性和事件支持,因而在数据操作功能上比ResultSet要丰富;后者是驱动级别的api,主要是获得数据库一线操作的数据集合,是前者底层支持者。这里可以看一段代码:    Connection con = null;    try { 
          con = ds.getConnection("managerID", "mgrPassword"); 
          Statement stmt = con.createStatement(); 
          ResultSet rs =  stmt.executeQuery(
                                "select * from coffees");
          
          CachedRowSet rset = new CachedRowSet(); 
          rset.populate(rs);//注意这里
          
          rs.close(); 
          stmt.close();
          
          return rset; 
        } finally { 
          if (con != null) con.close(); 
        } 值得注意的是,RowSet仍是一个不成熟的技术,还在发展之中。参考:http://developer.java.sun.com/developer/Books/JDBCTutorial/chapter5.html
      

  4.   

    呵呵,我发现自己简直菜的象朵花了,还是没太明白jxspace(彼黍离离) 的意思,不过相信随着今后的实践,应该能体会到的,谢谢各位了