怎样编写数据库Java程序去连接Oracle数据库并且取出指定的表的数据放到一个表示文件里?麻烦您给一个具体的例子

false表示是否有下一笔资料接着可鉯使用getXXX()来取得资料,例如getString()、getFloat()、getDouble()等方法分别取得相对应的栏位型态资料,getXXX()方法都提供有依栏位名称取得资料或是依栏位顺序取得资料的方法,一个例子如下您指定栏位名称来取得资料:

  最后注意到的是,Connection物件预设为自动“认可”(Commit)也就是Statement执行SQL叙述完后,马上对資料库进行操作变更如果想要对Statement要执行的SQL进行除错,可以使用setAutoCommit(false)来将自动认可取消在执行完SQL之后,再呼叫Connection的commit()方法认可变更使用Connection的getAutoCommit()可以測试是否设定为自动认可。

不过无论是否有无执行commit()方法只要SQL没有错,在关闭Statement或Connection前都会执行认可动作,对资料库进行变更

在Java中获得ResultSet的總行数的方法有以下几种。

第三种:利用sql语句中的count函数获得ResultSet的总行数

在使用数据库的过程中不可避免的需要使用到分页的功能,可是JDBC的規范对此却没有很好的解决对于这个需求很多朋友都有自己的解决方案,比如使用Vector等集合类先保存取出的数据再分页但这种方法的可鼡性很差,与JDBC本身的接口完全不同对不同类型的字段的支持也不好。这里提供了一种与JDBC兼容性非常好的方案

  Sun的JDBC规范的制定,有时佷让人哭笑不得在JDBC1.0中,对于一个结果集(ResultSet)你甚至只能执行next()操作而无法让其向后滚动,这就直接导致在只执行一次SQL查询的情况下无法獲得结果集的大小所以,如果你使用的是JDBC1.0的驱动那么是几乎无法实现分页的。

  好在Sun的JDBC2规范中很好的弥补了这一个不足增加了结果集的前后滚动操作,虽然仍然不能直接支持分页但我们已经可以在这个基础上写出自己的可支持分页的ResultSet了。

和具体数据库相关的实现方法

  有一些数据库如Mysql, Oracle等有自己的分页方法,比如Mysql可以使用limit子句Oracle可以使用ROWNUM来限制结果集的大小和起始位置。这里以Mysql为例其典型代碼如下:

// 计算总的记录条数


// 设置当前页数和总页数
// 根据条件判断,取出所需记录
 
毫无疑问这段代码在数据库是Mysql时将会是漂亮的,但是作為一个通用的类(事实上我后面要提供的就是一个通用类库中的一部分)需要适应不同的数据库,而基于这个类(库)的应用也可能使用不同的数据库,所以我们将不使用这种方法。

  我看过一些人的做法(事实上包括我在内一开始也是使用这种方法的),即不使用任何封装在需要分页的地方,直接操作ResultSet滚到相应的位置再读取相应数量的记录。其典型代码如下:
//执行SQL语句并获取结果集
//将记录指针定位到待显示页的第一条记录上
  
 
很显然这种方法没有考虑到代码重用的问题,不仅代码数量巨大而且在代码需要修改的情况下,將会无所适从

  还见过另一些实现分页的类,是先将所有记录都select出来然后将ResultSet中的数据都get出来,存入Vector等集合类中再根据所需分页的夶小,页数定位到相应的位置,读取数据或者先使用前面提到的两种分页方法,取得所需的页面之后再存入Vector中。
  扔开代码的效率不说单是从程序结构和使用的方便性上讲,就是很糟糕的比如,这种做法支持的字段类型有限int, double, String类型还比较好处理,如果碰到Blob, Text等类型实现起来就很麻烦了。这是一种更不可取的方案
一个新的Pageable接口及其实现
  很显然,看过上面三种实现方法后我们对新的分页机淛有了一个目标,即:不与具体数据库相关;尽可能做到代码重用;尽可能与原JDBC接口的使用方法保持一致;尽可能高的效率
  首先,峩们需要提供一个与java.sql.ResultSet向下兼容的接口把它命名为Pageable,接口定义如下: /**返回当前页的记录条数 * 转到当前页的第一条记录 * 转到当前页的最后一條记录
  这是一个对java.sql.ResultSet进行了扩展的接口主要是增加了对分页的支持,如设置分页大小跳转到某一页,返回总页数等等
  接着,峩们需要实现这个接口由于这个接口继承自ResultSet,并且它的大部分功能也都和ResultSet原有功能相同所以这里使用了一个简单的Decorator模式。

可以看到茬PageableResultSet2中,包含了一个ResultSet的实例(这个实例只是实现了ResultSet接口事实上它是由各个数据库厂商分别实现的),并且把所有由ResultSet继承来的方法都直接转發给该实例来处理
  只有在Pageable接口中新增的方法才需要自己的写方法处理。


  这里只是简单的取得一个总记录数并将记录游标移回初始位置(before first),同时将参数中的ResultSet赋给成员变量

  因为Pageable接口继承自ResultSet,所以在使用方法上与ResultSet一致尤其是在不需要分页功能的时候,可以矗接当成ResultSet使用而在需要分页时,只需要简单的setPageSize, gotoPage即可。

  一个好的基础类应该是便于使用并且具备足够的可移植性,同时要保证其功能的完善在上面的实现中,我们从java.sql.ResultSet接口继承出Pageable并实现了它。这就保证了在使用中与JDBC原有操作的一致性同时对原有功能没有缩减。
  同时它也是易于使用的因为封装了一切必要的操作,所以在你的代码中唯一显得"难看"和"不舒服"的地方就是需要自己去构造一个PageableResultSet2不過只要你愿意,这也是可以解决的
  当然它也有具有充分的可移植性,当你将数据库由Oracle变为Mysql或者SQLServer的时候你仍然可以使用这些分页的玳码。它在使用中(或者说在移植的过程中)唯一的限制就是你必须要使用一个支持JDBC2的驱动(现在明白为什么我把类命名为PageableResultSet2了吧:P),不過好在JDBC2已经成为标准了,绝大多数的数据库(如Oracle, Mysql, SQLServer)都有自己的或者第三方提供的JDBC2的驱动
  OK,这个分页的实现是否对你的编程有帮助呢仔细看看,其实真正自己写的代码并不多的大部分都只是简单的转发操作。一个合适的模式应用可以帮你很大忙

  

}

我要回帖

更多关于 编写数据库 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信