`

resultset 详解

阅读更多

结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等。 

结果集读取数据的方法主要是getXXX(),他的参数可以使整型表示第几列(是从1开始的),还可以是列名。返回的是对应的XXX类型的值。如果对应那列时空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false。使用getString()可以返回所有的列的值,不过返回的都是字符串类型的。XXX可以代表的类型有:基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型(java.sql.Timestamp),大数型(BigDecimal和BigInteger等)等。还可以使用getArray(int colindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用getAsciiStream(int colindex/String colname)可以获得该列对应的当前行的ascii流。也就是说所有的getXXX方法都是对当前行进行操作。 

结果集从其使用的特点上可以分为四类,这四类的结果集的所具备的特点都是和Statement语句的创建有关,因为结果集是通过Statement语句执行后产生的,所以可以说,结果集具备何种特点,完全决定于Statement,当然我是说下面要将的四个特点,在Statement创建时包括三种类型。首先是无参数类型的,他对应的就是下面要介绍的基本的ResultSet对应的Statement。下面的代码中用到的Connection并没有对其初始化,变量conn代表的就是Connection对应的对象。SqlStr代表的是响应的SQL语句。 
1.最基本的ResultSet。 

之所以说是最基本的ResultSet是因为,这个ResultSet他起到的作用就是完成了查询结果的存储功能,而且只能读去一次,不能够来回的滚动读取。这种结果集的创建方式如下:

Statement st = conn.CreateStatement
ResultSet rs = Statement.excuteQuery(sqlStr); 

由于这种结果集不支持,滚动的读去功能所以,如果获得这样一个结果集,只能使用它里面的next()方法,逐个的读去数据。 

2.可滚动的ResultSet类型。

这个类型支持前后滚动取得纪录next()、previous(),回到第一行first(),同时还支持要去的ResultSet中的第几行absolute(int n),以及移动到相对当前行的第几行relative(int n),要实现这样的ResultSet在创建Statement时用如下的方法。

Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)

  其中两个参数的意义是:

  resultSetType是设置ResultSet对象的类型可滚动,或者是不可滚动。取值如下:

ResultSet.TYPE_FORWARD_ONLY只能向前滚动

  ResultSet.TYPE_SCROLL_INSENSITIVE和Result.TYPE_SCROLL_SENSITIVE这两个方法都能够实现任意的前后滚动,使用各种移动的ResultSet指针的方法。二者的区别在于前者对于修改不敏感,而后者对于修改敏感。

resultSetConcurency是设置ResultSet对象能够修改的,取值如下:

ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。
ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。

  所以如果只是想要可以滚动的类型的Result只要把Statement如下赋值就行了。

Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE,ResultSet.CONCUR_READ_ONLY); 
ResultSet rs = st.excuteQuery(sqlStr);

  用这个Statement执行的查询语句得到的就是可滚动的ResultSet。
3.可更新的ResultSet

  这样的ResultSet对象可以完成对数据库中表的修改,但是我知道ResultSet只是相当于数据库中表的视图,所以并不时所有的ResultSet只要设置了可更新就能够完成更新的,能够完成更新的ResultSet的SQL语句必须要具备如下的属性:

a、只引用了单个表。
b、不含有join或者group by子句。
c、那些列中要包含主关键字。

  具有上述条件的,可更新的ResultSet可以完成对数据的修改,可更新的结果集的创建方法是:

Statement st = createstatement(Result.TYPE_SCROLL_INSENSITIVE,Result.CONCUR_UPDATABLE) 

  这样的Statement的执行结果得到的就是可更新的结果集。更新的方法是,把ResultSet的游标移动到你要更新的行,然后调用updateXXX(),这个方法XXX的含义和getXXX()是相同的。updateXXX()方法,有两个参数,第一个是要更新的列,可以是列名或者序号。第二个是要更新的数据,这个数据类型要和XXX相同。每完成对一行的update要调用updateRow()完成对数据库的写入,而且是在ResultSet的游标没有离开该修改行之前,否则修改将不会被提交。

  使用updateXXX方法还可以完成插入操作。但是首先要介绍两个方法:

moveToInsertRow()是把ResultSet移动到插入行,这个插入行是表中特殊的一行,不需要指定具体那一行,只要调用这个方法系统会自动移动到那一行的。
moveToCurrentRow()这是把ResultSet移动到记忆中的某个行,通常当前行。如果没有使用insert操作,这个方法没有什么效果,如果使用了insert操作,这个方法用于返回到insert操作之前的那一行,离开插入行,当然也可以通过next(),previous()等方法离开插入行。

  要完成对数据库的插入,首先调用moveToInsertRow()移动到插入行,然后调用updateXXX的方法完成对,各列数据的更新,完成更新后和更新操作一样,要写到数据库,不过这里使用的是insertRow(),也要保证在该方法执行之前ResultSet没有离开插入列,否则插入不被执行,并且对插入行的更新将丢失。 

4.可保持的ResultSet

  正常情况下如果使用Statement执行完一个查询,又去执行另一个查询时这时候第一个查询的结果集就会被关闭,也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connection的commit()方法也会关闭结果集。可保持性就是指当ResultSet的结果被提交时,是被关闭还是不被关闭。JDBC2.0和1.0提供的都是提交后ResultSet就会被关闭。不过在JDBC3.0中,我们可以设置ResultSet是否关闭。要完成这样的ResultSet的对象的创建,要使用的Statement的创建要具有三个参数,这个Statement的创建方式也就是,我所说的Statement的第三种创建方式。如下:

Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)
ResultSet rs = st.excuteQuery(sqlStr); 

  前两个参数和两个参数的createStatement方法中的参数是完全相同的,这里只介绍第三个参数:

resultSetHoldability表示在结果集提交后结果集是否打开,取值有两个:
ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。
ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭。 

  不过这种功能只是在JDBC3.0的驱动下才能成立。 

  Connection物件是代表Java与资料库的连线,接下来我们要执行SQL的话,必须取得 Statement物件,它代替您执行SQL叙述并取得执行之后的结果,您可以使用Connection的createStatement()来建立Statement物件:

Connection conn = DriverManager.getConnection(url, user, password); 
Statement stmt = conn.createStatement(); 

  取得Statement物件之后,我们可以使用executeUpdate()、executeQuery()等方法来执行 SQL,executeUpdate()主要是用来执行CREATE TABLE、INSERT、DROP TABLE、ALTER TABLE等会改变资料库内容的SQL,例如:

stmt.executeUpdate("INSERT INTO message VALUES('良葛格', " + "'caterpillar@mail.com', '留言吧', '2004-5-26'," +"'到此一游')"); 

  executeQuery()方法则是用于SELECT等查询资料库的SQL,executeUpdate()与 executeQuery()都会传回ResultSet物件,代表变更或查询的结果,查询的结果会是一笔一笔的资料,您使用next()来移动至下一笔资料,它会传回 true 或 false表示是否有下一笔资料,接着可以使用getXXX()来取得资料,例如getString()、getFloat()、getDouble()等方法,分别取得相对应的栏位型态资料,getXXX()方法都提供有依栏位名称取得资料,或是依栏位顺序取得资料的方法,一个例子如下,您指定栏位名称来取得资料:

ResultSet result = stmt.executeQuery("SELECT * FROM message"); 
while(result.next()) ...{ 
System.out.print(result.getString("name") + " "); 
System.out.print(result.getString("email") + " "); 
System.out.print(result.getString("subject") + " "); 
System.out.print(result.getString("time") + " "); 
System.out.println(result.getString("memo") + " "); 


  使用查询到的结果之栏位顺序来显示结果的方式如下:

ResultSet result = stmt.executeQuery("SELECT * FROM message"); 
while(result.next()) ...{ 
System.out.print(result.getString(1) + " "); 
System.out.print(result.getString(2) + " "); 
System.out.print(result.getString(3) + " "); 
System.out.print(result.getString(4) + " "); 
System.out.println(result.getString(5) + " "); 


  Statement的execute()可以用来执行SQL,并可以测试所执行的SQL是执行查询或是更新,传回 true的话表示SQL执行将传回ResultSet表示查询结果,此时可以使用getResultSet()取得ResultSet物件,如果 execute()传回false,表示SQL执行会传回更新笔数或没有结果,此时可以使用getUpdateCount()取得更新笔数。如果事先无法得知是进行查询或是更新,就可以使用execute()。

  下面是个完整的范例,注意我们在查询结束后,可以使用Statement的close()方法来释放Statement的资料库资源与JDBC资源,而最后不使用连线时也使用Connection的close()来关闭连线:

DBTest.java

package onlyfun.caterpillar; 
import java.sql.*; 
public class DBTest ...{
public static void main(String[] args) ...{
String driver = "com.mysql.jdbc.Driver"; 
String url = "jdbc:mysql://localhost:3306/GUESTBOOK?" + "useUnicode=true&characterEncoding=Big5" ; 
String user = "caterpillar"; 
String password = "123456"; 
Connection conn = null; 
Statement stmt = null; 

try ...{ 
Class.forName(driver); 
conn = DriverManager.getConnection(URL, user, password); 
stmt = conn.createStatement(); 
stmt.execute("INSERT INTO message VALUES('良葛格" + 
"', 'caterpillar@mail.com', '留言吧', "+ "'2004-5-26', '到此一游')"); 
ResultSet result = stmt.executeQuery("SELECT * FROM message"); 
while(result.next()) ...{
System.out.print(result.getString(1) + " "); 
System.out.print(result.getString(2) + " "); 
System.out.print(result.getString(3) + " "); 
System.out.print(result.getString(4) + " "); 
System.out.println(result.getString(5) + " "); 
}
}catch(ClassNotFoundException e) ...{
System.out.println("找不到驱动程式"); 
e.printStackTrace(); 
}catch(SQLException e) ...{
e.printStackTrace(); 
}finally ...{
if(stmt != null) ...{
try ...{
stmt.close(); 
}catch(SQLException e) ...{
e.printStackTrace(); 
}

if(conn != null) ...{
try ...{
conn.close(); 
}catch(SQLException e) ...{
e.printStackTrace(); 
}
}
}
}

分享到:
评论

相关推荐

    Java开发详解.zip

    031706_【第17章:Java数据库编程】_ResultSet接口笔记.pdf 031707_【第17章:Java数据库编程】_PreparedStatement接口笔记.pdf 031708_【第17章:Java数据库编程】_处理大数据对象(1)—处理CLOB数据笔记.pdf ...

    JDBC详解HTML-JDBC.pp

    <3>.ResultSet的方法:while(re.next()) next(),将游标往后移动一行,如果成功返回true;否则返回false getInt("id")或getSting("name"),返回当前游标下某个字段的值 5>.释放数据库连接 rs.close(); ps....

    java String详解

    NULL 博文链接:https://hui-jing-880210.iteye.com/blog/2173166

    JAVA的JDBC详解,面试必问

    * executeQuery():只能执行查询语句(DQL),返回ResultSet对象,即结果集对象。 * executeUpdate():执行DML语句(增删改语句)和DDL语句(数据定义语言,Create、Alter、Drop),返回受影响记录数或者零。 * ...

    jdbc操作数据库的基本流程详解

    所有的JDBC应用程序都具有下面的基本流程: 1、加载数据库驱动并建立到数据库的连接。 2、执行SQL语句。 3、处理结果。 4、从数据库断开连接释放资源。下面我们就来仔细看一看每一个步骤:其实按照上面所说每个...

    JDBC 连接MySQL实例详解

    JDBC连接MySQL JDBC连接MySQL 加载及注册JDBC驱动程序 Class.forName(“com.mysql.jdbc.Driver”); Class.forName(... ...JDBC URL 定义驱动程序与数据源之间的连接 ...jdbc:mysql//[hostname][:port]/[d

    java基础案例与开发详解案例源码全

    18.2.4 ResultSet接口467 18.3 JDBC操作SQL469 18.4 JDBC基本示例473 18.5 JDBC应用示例479 18.6 本章习题492 第19章 19.1 网络编程的基本概念494 19.1.1 网络基础知识494 19.1.2 网络基本概念495 19.1.3 网络传输...

    jdbc-demo:二进制详解系列(二)------ jdbc-mysql的使用和分析-mysql

    通过提供DriverManager , Connection , Statement , ResultSet等接口将开发人员与数据库提供商隔离,开发人员只需要面对JDBC接口,无需担心如何跟数据库交互。几个重要的类类名作用DriverManager驱动管理器,用于...

    JDBC(powernode 文档)源代码

    2.2.5 处理ResultSet结果 2.2.6 关闭数据库资源 3.准备工作 3.1 创建数据库并创建student表 3.2 创建项目 3.3 创建lib目录并引入MYSQL驱动包 3.4 把lib包引入项目环境 4.使用JDBC完成添加操作 4.1 步骤 4.2...

    Java_JDBC由浅入深

    第五节 ResultSet接口的使用详解 20 第六节 JDBC 中数据类型详解 30 6.1 基本数据类型 30 6.2 日期类型 34 6.3 CLOB类型 36 6.4 BLOB类型 39 6.5 其他数据类型 41 第七节 DAO设计模式详解 41 7.1 实际项目中如何使用...

    JDBC 连接MySQL数据库的一系列详细步骤

    JDBC 连接MySQL数据库的一系列详细步骤,包括JDBC API详解 1.DriverManager 2.Connection 3.Statement 4.ResultSet 5.PrepareStatement

    解析jdbc处理oracle的clob字段的详解

    import java.io.BufferedOutputStream;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io....import java.sql.ResultSet;import java.sql.SQLException; 代码如下:public class Cl

    halo-query:建立在spring jdbc 基础上的数据库操作框架。简化spring jdbc调用。支持分布式数据库操作,支持单库jdbc事务

    #一个轻量级orm框架,自动组装ResultSet结果集。 ##底层使用的是spring jdbcTemplate ##目前支持的数据库为mysql,db2 ##mysql,db2测试通过 ##支持分分布式数据库操作,支持单库jdbc事务,支持读写分离(请看database_...

    JDBC学习资料

    详解JDBC,如何与数据库交互数据。 1 What is JDBC? 2 The most important hiberarchy of JDBC interface. 3 The type of JDBC. 4 The step of developping a JDBC app. 5 How to handle resultset? 6 Statement ****...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 ... ...Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 开本:16开 ... ...Java编程老鸟潜心写作,奉献高效率的Java学习心得 完全站在没有编程经验读者的...

    Spring中文帮助文档

    11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6. 用Java对象来表达JDBC操作 11.6.1. SqlQuery类 11.6.2. MappingSqlQuery类 11.6.3. SqlUpdate类 11.6.4. StoredProcedure类 11.6.5. SqlFunction...

    Spring API

    11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6. 用Java对象来表达JDBC操作 11.6.1. SqlQuery类 11.6.2. MappingSqlQuery类 11.6.3. SqlUpdate类 11.6.4. StoredProcedure类 11.6.5. SqlFunction...

Global site tag (gtag.js) - Google Analytics