java中result和resultSet
ResultSet:
1,定义
public interface ResultSet
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
2,获得
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
3,迭代
ResultSet
对象具有指向其当前数据行的指针。最初,指针被置于第一行之前。next
方法将指针移动到下一行;因为该方法在 ResultSet
对象中没有下一行时返回 false
,所以可以在 while
循环中使用它来迭代结果集。
while(rs.next())
{
}
4,取值
ResultSet
接口提供用于从当前行检索列值的获取方法(getBoolean
、getLong
等)。可以使用列的索引编号或列的名称检索值。一般情况下,使用列索引较为高效。 列从 1 开始编号。为了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,而且每列只能读取一次。
rs.getString();
以上部分摘自JDK1.5的中文版文档,如果由于版本问题导致了一些问题,请见谅。在此并没有详尽的列出所有关于ResultSet的信息,大家可自行翻阅文档。但是我们在程序中基本上就只使用以上列出的部分了,我猜在大部分情况下,我们在WEB应用中,很少使用ResultSet进行数据更新吧?所以我并没有列出关于数据更新的相关内容,感兴趣的可自行查看。
下面想象一个问题:我从数据库查询某一表的所有数据,估计100行吧,但是肯定不知道具体多少行,我们使用ResultSet来存储。那么我想取出最后一行的第一列的某一个字段值,怎么办呢?除了迭代还有什么好办法吗?我甚至有可能在一个方法内部多次使用到这样的需求:我就想随意的取出任意行的任意列。怎么办呢,反复迭代吗?有没有考虑过数据库连接的问题?
就我目前的知识层次来说,我对以上问题在现有的ResultSet上,无能为力,不知道怎么办?我翻遍了我的JDK1.5的中文版文档也没能找到好的答案,我顿时觉得文档落伍了。JAVA的使用率较.Net更大,难道就找不到类似Datatable的数据集吗?我猜是有的,只是我使用的文档貌似是针对JAVA SE版本,可能没有涉及到更深入的企业级应用。
在讲解Result之前,先说说目前大家都怎么来存储数据集吧。毫无疑问,在SSH框架中,大家都使用实体List,这样就很方便迭代,也很方便定位,而且在展现的时候借助Struts标签,很给力 。但是,我基本上是拒绝使用的,第一,目前SSH配合List使用的 查询语言HQL一点也不好用,也不快速(个人感觉)。第二,冗余字段,我只想查询一个表的两个字段,没必要查询出整个表的几十个字段吧!第三,表连接的问题,难道有什么完美的解决方案吗?难道有比join更好的吗?甚至有些人在没有使用ORM框架的情况下,先自行查询出ResultSet,而后再另行迭代封装到实体List中,这样做真的值得吗?
Result:
1, 定义
表示数据库结果集的数据表。完整名称javax.servlet.jsp.jstl.sql.Result
2, 获得
为了得到Result,我们首先必须先要得到Result,然后使用ResultSupport.toResult(rs)转化即可。
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
Result rst = ResultSupport.toResult(rs);
3, 迭代
很不幸鄙人住处不能上网,无法下载阅读源代码,资料也比较匮乏,度娘和谷哥还有搜妹在这个问题也都没能给力,最后就只能一点点的尝试了。功夫不负有心人,终于被我发现以下用法:
for (SortedMap item : rst.getRows()) {
}
这种迭代方式并没有比ResultSet的更复杂,而且如果你愿意的话,你可以稍作修改使迭代可以从任意行开始,也可以从任意端开始。
4, 取值
由于Result中的每一行都是SortedMap,所以遵循规则:
Object value=item.get(key);( SortedMap的另外一些方法当然也适用)
介绍完两个数据集,相信大家都有所了解了。其实他们的作用相同,用法也类似,大部分情况下,两者通用几乎没有什么问题。
现在我尝试着使用Result解决一下刚刚标红还不能解决的问题。
1, 取得最后一行第一列
Object o= rst.getRowsByIndex()[rst.getRowCount()][0];
这难道不够简单吗?
2, 取得任意行任意列
Object o= rst.getRowsByIndex()[行索引][列索引];
请注意:一定要做好防范,避免抛出超出索引的异常。其他用法以后慢慢开发吧。另外还需要说明的是,一旦我们从ResultSet获得Result后,数据库连接即可释放,不会存在占用连接的情况。
有些人说我就用实体List,让ResultSet和Result都见鬼去吧。
我才不管呢!快速,直接,简单,抛弃冗余字段,我做的没错吧?
至于大家怎么选择,随心吧。码农也是感性的。