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 ...
随机推荐
- crt转cer ,6.0以上的android系统证书请求配置
1.在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句 openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der 这样你就可以得到cer ...
- ROM的一种写法
module mr_rom_pll_valuemask_8bpc #( , , , , // 6*7 // alt_clogb2(42) ) ( input wire clock, :] addr_p ...
- 树形控件(CTreeCtrl和CTreeView)
如何插入数据项目? 如何添加鼠标右击事件? 插入数据项 通过InsertItem()方法,有四种重载样式: HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsert ...
- Java理论学时第二节。课后作业。
枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象,相同的值则引用同一个对象. 可以使用“==”和equals()方法直接比对枚举变量的值,换句话说,对于枚举类型的变量,“==”和equals ...
- Protocol Buffer 序列化原理大揭秘 - 为什么Protocol Buffer性能这么好?
前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存 ...
- QOpenglWidget 与QGLWidget的选择
1. QGLWidget 是Qt OpenGL模块,但是从其官方说明,推荐在Qt5.4 之后,使用QOpenglWidget版本,具体说明如下: Note: This class is part of ...
- [ 9.11 ]CF每日一题系列—— 441C暴力模拟
Description: n * m 的地图,建设k个管道管道只能横竖走,且长度大于等于2,问你任意一种建设方法 Solution: 图里没有障碍,所以先把前k - 1个管道每个分2个长度,最后一个管 ...
- Android中的假TabHost-只是在上层覆盖了一层TabWidget
TabHost是整个Tab的容器,包含TabWidget和FrameLayout两个部分,TabWidget是每个Tab的表情,FrameLayout是Tab内容. 实现方法:继承TabActivit ...
- AngularJS 表单数据验证及错误信息提示
一.表单验证基本原理 表单验证包括两个主题: 定义验证规则,验证数据有效性. 显示验证结果,把验证结果以友好的方式显示给用户. H5内置一些验证功能,并会显示内置的错误提示信息,先要禁用它,在< ...
- ExternalException (0x80004005): GDI+ 中发生一般性错误
.net开发的程序用了一个自绘的框架, 平常部署到IIS上都没有问题,今天突然之间这个功能就运行不起来了. 报错:GDI+错误,然后在本地的VS里面运行是没有问题的 百度出来的改Path环境变量.注册 ...