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都见鬼去吧。
我才不管呢!快速,直接,简单,抛弃冗余字段,我做的没错吧?
至于大家怎么选择,随心吧。码农也是感性的。
java中result和resultSet的更多相关文章
- Java 中的resultset详解
结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等. 结果集读取数据 ...
- java 中的resultset的类型
结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等. 结果集读取数据 ...
- 第83节:Java中的学生管理系统分页功能
第83节:Java中的学生管理系统分页功能 分页功能一般可以做成两种,一种是物理分页,另一种是逻辑分页.这两种功能是有各自的特点的,物理分页是查询的时候,对数据库进行访问,只是查一页数据就进行返回,其 ...
- 第80节:Java中的MVC设计模式
第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...
- 第77节:Java中的事务和数据库连接池和DBUtiles
第77节:Java中的事务和数据库连接池和DBUtiles 前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许 ...
- 在Java中使用SQLite的教程(转)
简介:这是在Java中使用SQLite的教程的详细页面,介绍了和java,有关的知识.技巧.经验,和一些java源码等. 简单的在Java中使用SQLite的教程 使用SQLiteJDBC封装 www ...
- java中regex参考
在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu ...
- java中instanceof的基本使用
java中的instanceof运算符是用于判断对象是否是指定类或这个指定类的子类的一个实例,返回值是布尔类型. 语法: boolean result = object instanceof clas ...
- Java中连接MySql数据库的例子
Java中连接MySql数据库的例子: package com.joinmysql.demo; import java.sql.DriverManager; import java.sql.Resul ...
随机推荐
- sqlserver2008查询性能优化(文摘)
第1章 sql查询性能调整 第4章 索引分析
- TCP/IP协议(5):传输层之TCP
一.TCP报文 上图为TCP报文的格式,可以看到TCP头部占20个字节,其中红色圆圈中每一项占一位,表示TCP报文的类型,置1表示该项有效. SYN表示建立连接. FIN表示关闭连接. A ...
- 表单提交textarea内容,第一次获取不到值,第二次才能获取到的解决方法:
因为KindEditor的可视化操作在新创建的iframe上执行,代码模式下的textarea框也是新创建的,所以最后提交前需要执行 sync() 将HTML数据设置到原来的textarea. Kin ...
- c#中委托与事件
参考:http://www.tracefact.net/tech/009.html 张子阳:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/9 ...
- WordPaster-CuteEditor6.7整合教程
CuteEditor6.7下载地址:http://yunpan.cn/QzvjC5iaH5HJm 1.添加CuteEditor.dll的引用 2.在编辑器页面,为编辑器工具栏增加控件按钮 3.在前台增 ...
- mysql-5.7.19 压缩安装 设置密码
初始化完毕后,如果没使用新版本的客户端登入,还会报告类似下面的错误: mysql -uroot -p Enter password: ERROR 1862 (HY000): Your password ...
- C++指针一
指针也是变量,占有内存空间,用来保存内存地址. 指针也是一种数据类型,指针是一种数据类型,是指它所致内存空间的数据类型. 指针变量和它指向的内存块是两个不同的概念 *p操作内存 在指针声明时,*号表示 ...
- _杂谈_C语言历史
早期的操作系统软件主要是用汇编语言(包括UNIX操作系统在内)编写的.由于汇编语言依赖于计算机硬件,所以程序的可读性和可移植性都比较差,所以呢,为了提高操作系统软件的可读性和可移植性,最好改用高级语言 ...
- C++语言定义的标准转换
标准转换 C++ 语言定义其基础类型之间的转换. 它还定义指针.引用和指向成员的指针派生类型的转换. 这些转换称为“标准转换. 1. 整型提升 整数类型的对象可以转换为另一个更宽的整数类型(即,可表示 ...
- NTP 服务器搭建
FROM:http://blog.sina.com.cn/s/blog_511b46d10100agzf.html 配置环境: 1. 假设在 192.168.0.0 网段内,要以IP为 10.233. ...