| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5541 人关注过本帖
标题:JDBC基础教程之ResultSet对象
只看楼主 加入收藏
java小蚂蚁
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:上海
等 级:贵宾
威 望:18
帖 子:558
专家分:2186
注 册:2013-7-2
结帖率:92.59%
收藏
 问题点数:0 回复次数:1 
JDBC基础教程之ResultSet对象
JDBC基础教程之ResultSet对象
 
  概述

  ResultSet 包含符合 SQL 语句中条件的所有行,并且它通过一套 get 方法(这些 get 方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet.next 方法用于移动到 ResultSet 中的下一行,使下一行成为当前行。

  结果集一般是一个表,其中有查询所返回的列标题及相应的值。例如,如果查询为 SELECT a, b, c FROM Table1,则结果集将具有如下形式:

a b c
-------- --------- --------
12345 Cupertino CA
83472 Redmond WA
83492 Boston MA

  下面的代码段是执行 SQL 语句的示例。该 SQL 语句将返回行集合,其中列 1 为 int,列 2 为 String,而列 3 则为字节数组:

java.sql.Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (r.next())
{
 // 打印当前行的值。
 int i = r.getInt("a");
 String s = r.getString("b");
 float f = r.getFloat("c");
 System.out.println("ROW = " + i + " " + s + " " + f);
}

  1、行和光标

  ResultSet 维护指向其当前数据行的光标。每调用一次 next 方法,光标向下移动一行。最初它位于第一行之前,因此第一次调用 next 将把光标置于第一行上,使它成为当前行。随着每次调用 next 导致光标向下移动一行,按照从上至下的次序获取ResultSet 行。

  在 ResultSet 对象或其父辈 Statement 对象关闭之前,光标一直保持有效。

  在 SQL 中,结果表的光标是有名字的。如果数据库允许定位更新或定位删除,则需要将光标的名字作为参数提供给更新或删除命令。可通过调用方法getCursorName 获得光标名。

  注意:不是所有的 DBMS 都支持定位更新和删除。可使用 DatabaseMetaData.supportsPositionedDelete 和 supportsPositionedUpdate 方法来检查特定连接是否支持这些操作。当支持这些操作时,DBMS/驱动程序必须确保适当锁定选定行,以使定位更新不会导致更新异常或其它并发问题。

2、列

  方法 getXXX 提供了获取当前行中某列值的途径。在每一行内,可按任何次序获取列值。但为了保证可移植性,应该从左至右获取列值,并且一次性地读取列值。列名或列号可用于标识要从中获取数据的列。例如,如果 ResultSet 对象 rs 的第二列名为“title”,并将值存储为字符串,则下列任一代码将获取存储在该列中的值:


String s = rs.getString("title");
String s = rs.getString(2);

  注意列是从左至右编号的,并且从列 1 开始。同时,用作 getXXX 方法的输入的列名不区分大小写。

  提供使用列名这个选项的目的是为了让在查询中指定列名的用户可使用相同的名字作为 getXXX 方法的参数。另一方面,如果 select 语句未指定列名(例如在“select * from table1”中或列是导出的时),则应该使用列号。这些情况下,
户将无法确切知道列名。

  有些情况下,SQL 查询返回的结果集中可能有多个列具有相同的名字。如果列名用作 getXXX 方法的参数,则 getXXX 将返回第一个匹配列名的值。因而,如果多个列具有相同的名字,则需要使用列索引来确保检索了正确的列值。这时,使用列号效率要稍微高一些。

  关于 ResultSet 中列的信息,可通过调用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 对象将给出其 ResultSet 对象各列的编号、类型和属性。

  如果列名已知,但不知其索引,则可用方法 findColumn 得到其列号。

  3、数据类型和转换

  对于 getXXX 方法,JDBC 驱动程序试图将基本数据转换成指定 Java 类型,然后返回适合的 Java 值。例如,如果 getXXX 方法为 getString,而基本数据库中数据类型为 VARCHAR,则 JDBC 驱动程序将把 VARCHAR 转换成 Java String。getString 的返回值将为 Java String 对象。

  下表显示了允许用 getXXX 获取的 JDBC 类型及推荐用它获取的 JDBC 类型(通用SQL 类型)。小写的 x 表示允许 getXXX 方法获取该数据类型;大写的 X 表示对该数据类型推荐使用 getXXX 方法。例如,除了 getBytes 和 getBinaryStream 之外的任何 getXXX 方法都可用来获取 LONGVARCHAR 值,但是推荐根据返回的数据类型使用 getAsciiStream 或 getUnicodeStream 方法。方法 getObject 将任何数据类型返回为 Java Object。当基本数据类型是特定于数据库的抽象类型或当通用应用程序需要接受任何数据类型时,它是非常有用的。

  可使用 ResultSet.getXXX 方法获取常见的 JDBC 数据类型。

  “x”表示该 getXXX 方法可合法地用于获取给定 JDBC 类型。

  “X”表示推荐使用该 getXXX 方法来获取给定 JDBC 类型。

  getByte X x x x x x x x x x x x x            
  getShort x X x x x x x x x x x x x            
  getInt x x X x x x x x x x x x x            
  getLong x x x X x x x x x x x x x            
  getFloat x x x x X x x x x x x x x            
  getDouble x x x x x X X x x x x x x            
  getBigDecimal x x x x x x x X X x x x x            
  getBoolean x x x x x x x x x X x x x            
  getString x x x x x x x x x x X X x x x x x x x
  getBytes                           X X x      
  getDate                     x x x       X   x
  getTime                     x x x         X x

  getTimestamp                     x x x       x   X
  getAsciiStream                     x x X x x x      
  getUnicodeStream                     x x X x x x      
  getBinaryStream                           x x X      
  getObject x x x x x x x x x x x x x x x x x x x
4、对非常大的行值使用流

  ResultSet 可以获取任意大的 LONGVARBINARY 或 LONGVARCHAR 数据。方法getBytes 和 getString 将数据返回为大的块(最大为 Statement.getMaxFieldSize 的返回值)。但是,以较小的固定块获取非常大的数据可能会更方便,而这可通过让 ResultSet 类返回 流来完成。从该流中可分块读取数据。注意:必须立即访问这些流,因为在下一次对 ResultSet 调用getXXX 时它们将自动关闭(这是由于基本实现对大块数据访问有限制)。

  JDBC API 具有三个获取流的方法,分别具有不同的返回值:

  getBinaryStream 返回只提供数据库原字节而不进行任何转换的流。

  getAsciiStream 返回提供单字节 ASCII 字符的流。

  getUnicodeStream 返回提供双字节 Unicode 字符的流。

  注意:它不同于 Java 流,后者返回无类型字节并可(例如)通用于 ASCII 和Unicode 字符。

  下列代码演示了 getAsciiStream 的用法:


java.sql.Statement stmt = con.createStatement();
ResultSet r = stmt.executeQuery("SELECT x FROM Table2");
// 现在以 4K 块大小获取列 1 结果:
byte buff = new byte[4096];
while (r
// 将新填充的缓冲区发送到 ASCII 输出流:
output.write(buff, 0, size);
}
}

  5、NULL 结果值

  要确定给定结果值是否是 JDBC NULL,必须先读取该列,然后使用 ResultSet.wasNull 方法检查该次读取是否返回 JDBC NULL。

  当使用 ResultSet.getXXX 方法读取 JDBC NULL 时,方法 wasNull 将返回下列值之一:

  Java null 值:对于返回 Java 对象的 getXXX 方法(例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject 等)。

  零值:对于 getByte、getShort、getInt、getLong、getFloat 和 getDouble。

  false 值:对于 getBoolean。

  6、可选结果集或多结果集

  通常使用 executeQuery(它返回单个 ResultSet)或 executeUpdate(它可用于任何数据库修改语句,并返回更新行数)可执行 SQL 语句。但有些情况下,应用程序在执行语句之前不知道该语句是否返回结果集。此外,有些已存储过程可能返回几个不同的结果集和/或更新计数。

  为了适应这些情况,JDBC 提供了一种机制,允许应用程序执行语句,然后处理由结果集和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的execute 方法,然后调用另外三个方法,getResultSet、getUpdateCount 和getMoreResults。这些方法允许应用程序一次一个地研究语句结果,并确定给定结果是 ResultSet 还是更新计数。

  为了适应这些情况,JDBC 提供了一种机制,允许应用程序执行语句,然后处理由结果集和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的execute 方法,然后调用另外三个方法,getResultSet、getUpdateCount 和getMoreResults。这些方法允许应用程序一次一个地研究语句结果,并确定给定结果是 ResultSet 还是更新计数。

  用户不必关闭 ResultSet;当产生它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时,该 ResultSet 将被 Statement 自动关闭。
搜索更多相关主题的帖子: Boston 
2013-07-31 15:37
java小蚂蚁
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:上海
等 级:贵宾
威 望:18
帖 子:558
专家分:2186
注 册:2013-7-2
收藏
得分:0 
Java标准技术
学通Java语言需要一个过程,所有Java相关的概念都会在学习的过程中逐渐变得清昕。这个过程的开始就是要先学会标准的Java技术(J2SE),然后是学Java的简单Web运用,然后分布式运用,再以后对Java的移动技术运用就很容易理解了。

  以下是Java标准技术的一些要点:

  一、Java的跨平台性,即一次编译到处运行

  简单地说Java的跨平台性就是指,编译后的Java程序可直接在不同的平台上运行而不用重新编译,这一特性使得Java随着Web应用的普及而迅速普及起来。而Java的跨平台性是如何实现的呢?这就要理解Java虚拟机和字节码的概念。

  实际上,编译后的Java代码并不是传统的二进制代码(如Windows下的.exe文件),而是Java字节码,这种字节码文件是不能直接在操作系统上执行的。要想在一个操作系统上运行一个Java程序必须有一个中间环节来负责将Java字节码解释成二进制码,这个中间环节就是Java虚拟机(简称JVM)。由于目前大多数操作系统已经实现了JVM,所以Java轻松实现跨平台性。

  二、面象对象技术

  Java全面支持面象对象技术,这体现在Class(类)是Java程序构成的基本单元,一个Java程序通常由许多Class组成,而且这些Class还会有一定的继承关系,Java支持Class的单继承,从而使类之间的继承关系更明确。继承的结果产生类的多态性,类的多态本质上讲就是可以用父类的引用访问继承类的实现(子类对象),类的这种多态性最终形成了组件对象模型的基础,即通过接口(父类)访问实现(子类)。

  三、Java中的I/O操作

  Java中以字节流(InputStream和OutputStream)、节符流(Reader和Writer)来分别读写二进制数据和字符数据,使用非常简单有效。Java类库中的File类不仅提供文件操作而且还包含文件夹操作,如下面这几行代码可以列出C盘根目录下的所有文件:

  File f=new File("c://");
  String [] m_dir= f.list();
  for(int i=0;i<m_dir.length;i++)
  System.out.println(m_dir[i]);

  四、Java中的图形及事件处理

  可以用awt包或swing包的Java类来进行大部分的Java图形界面设计,下面的几行代码将产生一个200*200像素的窗体:

  Frame f=new Frame("Welcome");
  f.setSize(200,200);
  f.setVisible(true);

  默认情况下,Frame窗体的关闭按钮不起作用,这也是Java初学者迷惑的地方。为了使用户按下关闭按钮时能关闭Frame窗体,需要让这个窗体响应一个WindowEvent事件,具体的做法就是给这个窗体添加一个事件监听器对象,这个事件监听器就是WindowListener接口的实现。在上面的代码中插入如下代码就可以关闭窗体:

  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.exit(0);
   }
  }

  这里用到一个无名内部类,无名内部类是Java中内部类的一种灵活运用方式。

  五、Java中线程及同步控制

  线程概念的引入是为了实现并行处理,从而提高程序的效率。Java中的线程实现非常简单,可以用两种方式来创建线程,一种是实现Runnable接口,另一种是继承Thread类重写run()方法。两种方式唯一的不同就是前者保留了继承一个类的可能(因为Java只支持类的单继承,但接口没有此限制)。

  永远都用start()方法来启动一个线程,线程类中的run()可以被直接调用,但决不是启动一个线程,二者有着本质的区别。

  用同步控制关键字synchronized来保护线程敏感数据,synchronized块中的内容可以保证同一时刻只能被一个线程访问,所以其中的数据是线程安全的。

  用Object类中的wait()和notify()方法可以实现线程间交互,但要记住wait()和notify()方法只有发生在同一个对象上才能真正实现线程间交互。被某一对象wait()方法阻塞的线程需要另外一个调用了同一对象notify()的线程干预才能恢复运行。notify()方法一次唤醒一个被wait()方法阻塞的线程,notifyAll()方法可以一次唤醒所有被wait()方法阻塞的线程。

  六、Java本地方法(native方法)的实现

  Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。

  可以将native方法比作Java程序同C程序的接口,其实现步骤:

  1、在Java中声明native()方法,然后编译;
  2、用javah产生一个.h文件;
  3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);
  4、将第三步的.cpp文件编译成动态链接库文件;
  5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。

  上述所提及的一些Java技术具有一定的普遍性,它们基本上是在Java各个方面的运用中都需要掌握的术。实际上Java的运用非常广泛,而且每个方面都需要遵循不同的规范。以下是对Java应用的简要介绍。

  (一)理解Java SDK的三个版本:

  Java SDK Micro Edition   (J2ME)

  用于开发掌上电脑、手机等移动通信设备上使用的应用程序。并不是所有的移动设备都支持Java,只有具备J2ME运行环境(JVM+J2ME API)的设备才能运行Java程序。J2ME的集成开发工具(通常都有带有一些访真器)有 Sun 的J2ME Wireless Toolkit 、IBM的Visul Age Micro Edition 等。

  Java SDK Standard  Edition(J2SE)

  主要用于开发一般台式机应用程序。我们平时所说的JDK就指J2SE,而我们学Java就是从学习J2SE开始的。

  Java SDK Enterprise Edition (J2EE)

  用于开发分布式的企业级大型应用程序。其中的核心是Entetprise Java Beans(EJB,分布式Java组件)的开发。

  (二)Java小程序 (Applet)

  Java小程序是一个继承了Applet类并重写了init()、paint()、stop()等方法的的Java类,它被布署在Web服务器(如IIS)上,当客户端请求Web页时,浏览器从Web服务器上将其下载到本地客户端,然后,浏览器创建该Applet类的实例并调用其init()方法,从安全角度考虑,Applet没有访问本地文件的权限。由于Applet是被浏览器执行的,所以Applet不需要一个main()方法。实际上,除了Java Application之外,所有其它Java应用都不需要一个main()方法。

  (三)服务器端Java小程序 (Servlet)

  Servlet也是一个Java类,和Applet形成对比,Servlet是运行于服务器端的Java小程序,而且Servlet需要一个单独的Web服务器(如Tomcat)做容器。除此之外,Servlet中用到的一些类(如HttpServlet)并不包含在J2SE API中,所以需要将Servlet.jar(在Tomcat的common\lib文件夹下)加到环境变量中去。下面是一个简单的Servlet例子:

  public class Myservlet extends HttpServlet{  

   public void doGet(HttpServletRequest request,HttpServletResponse response)
    {
     try{
      response.setContentType("text/html");
      PrintWriter out=response.getWriter();
      out.println("<html>");
      out.println("<body>");
      out.println("Hello world");
      out.println("</body>");
      out.println("</html>");
     }catch(IOException e){}
    }
  }

  将这个Class文件编译后放至Tomcat\webapps\examples\WEB-INF\classes下,然后在浏览器地址栏里输入http://127.0.0.1:8080/examples/servlet/Myservlet即可看到 Hello world出现在浏览器中。

  (四)Java Server Page (JSP)

  同Servlet相似的是,JSP运行于Web服务器端,并且也需要Tomcat之类的容器。不同的是,由于JSP是将Java代码嵌在html标记里(同ASP一样用<% ...%>),JSP的界面设计同后台开发人员的工作可以有效分离。可以想像让开发人员用Servlet写一个花捎的Web页面有多困难,所以JSP+Servlet混合Web应用是比较理想的选择。

  看起来JSP同ASP的实现机制大同小异,其实也存在着本质的区别。所有的ASP页面都是解释运行的,而JSP页在第一次被请求时会被编译,再以后的客户请求都是直接运行服务器上的.class文件(在Tomcat的Work文件夹下),所以JSP要比ASP速度上快许多。

  (五)Java Beans

  Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。

  (六)Enterprise Java Beans (EJB)

  Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。

  这种模型很像COM+管理器,其实EJB容器正是起到COM+管理器的作用,只是EJB组件相对COM组件来说更易用、更安全。

  总的说来,Java作为面象对象技术的一个代表,在当今商业应用中更容易开发出高效的、多层的分布式应用程序,而且,由于Java技术有很强的健壮性和易用性,加上同UML应用的结合,开发一个商业应用软件的周期会大大缩短,所以Java会有不错的前景。

学海无涯#¥%……&*(
2013-07-31 15:38
快速回复:JDBC基础教程之ResultSet对象
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039010 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved