`

ResultSet用法集锦

 
阅读更多

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(intcolindex/String columnname),通过这个方法获得当前行中,colindex所在列的元素组成的对象的数组。使用 getAsciiStream(intcolindex/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

 

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

 

 

 Result.TYPE_SCROLL_SENSITIVE

 

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的第三种创建方式。如下:


Statementst=createStatement(int resultsetscrollable,int resultsetupdateable,intresultsetSetHoldability)
ResultSet rs = st.excuteQuery(sqlStr);

 

前两个参数和createStatement方法中的参数是完全相同的,这里只介绍第三个参数:
resultSetHoldability表示在结果集提交后结果集是否打开,取值有两个:

 

ResultSet.HOLD_CURSORS_OVER_COMMIT

 

表示修改提交时ResultSet不关闭.

ResultSet.CLOSE_CURSORS_AT_COMMIT

 

表示修改提交时ResultSet关闭.

 

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

 

 

 

 

 

总结:


JDBCAPI 2.0/3.0ResultSet记录集的
JDBC API 2.0/3.0中ResultSet记录集的简便实用的新特性

1 新定义了若干个常数,这些常数用于指定ResultSet的类型游标移动的方向等性质,如下所示:  

 

FETCH_FORWARD

该常数的作用是指定处理记录集中行的顺序,是由前到后即从第一行开始处理一直到最后一行.

 

FETCH_REVERSE

该常数的作用是指定处理记录集中行的顺序,是由后到前即从最后一行开始处理一直到第一行.

 

FETCH_UNKNOWN

该常数的作用是不指定处理记录集中行的顺序,由JDBC 驱动程序和数据库系统决定.

 

TYPE_FORWARD_ONLY

该常数的作用是指定数据库游标的移动方向是向前,不允许向后移动即只能使ResultSet 接口的next()方法而不能使用previous()方法否则会产生错误.

 

 

TYPE_SCROLL_INSENSITIVE

该常数的作用是指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作不敏感;就是说,当前用户正在浏览记录集中的数据,与此同时,其他用户更新了数据库中的数据,但是当前用户所获取的记录集中的数据不会受到任何影响。

 

 

 

TYPE_SCROLL_SENSITIVE

该 常数的作用是指定数据库游标可以在记录集中前后移动,并且当前数据库用户获取的记录集对其他用户的操作敏感,就是说,当前用户正在浏览记录集,但是其它用 户的操作使数据库中的数据发生了变化,当前用户所获取的记录集中的数据也会同步发生变化,这样有可能会导致非常严重的错误产生建议慎重使用该常数。

 

CONCUR_READ_ONLY

该常数的作用是指定当前记录集的协作方式(concurrencymode)为只读;一旦使用了这个常数,那么用户就不可以更新记录集中的数据。

 

CONCUR_UPDATABLE

该常数的作用是指定当前记录集的协作方式(concurrencymode)为可以更新;一旦使用了这个常数,那么用户就可以使用updateXXX()等方法更新记。

CLOSE_CURSORS_AT_COMMIT

 

表示修改提交时ResultSet关闭.

HOLD_CURSORS_OVER_COMMIT

 

表示修改提交时ResultSet不关闭.



2 ResultSet 接口提供了一整套的定位方法


这些可以在记录集中定位到任意一行:

 

public boolean absolute(int row): 该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行,参数row 指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算不是相对的行号.

 

public boolean relative(int rows): 该方法的作用也是将记录集中的某一行设定为当前行,但是它的参数rows 表示目标行相对于当前行的行号。

 

public boolean first(); 该方法的作用是将当前行定位到数据库记录集的第一行。

 

public boolean last(); 该方法的作用刚好和first()方法相反。

 

public boolean isFirst(); 该方法的作用是检查当前行是否记录集的第一行,如果是返回true, 否则返回false.

 

public boolean isLast(); 该方法的作用是检查当前行是否记录集的最后一行,如果是返回true ,否则返回false。

 

public void afterLast(); 该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的后面,如果该记录集不包含任何的行该方法不产生作用。

 

public void beforeFirst(); 该方法的作用是将数据库游标移到记录集的最前面,位于记录集第一行的前面,如果记录集不包含任何的行该方法不产生作用。

 

public boolean isAfterLast(); 该方法检查数据库游标是否处于记录集的最后面,如果是返回true ,否则返回false。

 

public boolean isBeforeFirst(); 该方法检查数据库游标是否处于记录集的最前面,如果是返回true ,否则返回false。

 

 

public boolean next(); 该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行,当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面,第一次使用next()方 法将会使数据库游标定位到记录集的第一行,第二次使用next()方法将会使数据库游标定位到记录集的第二行,以此类推。

 

 

public boolean previous(); 该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行.

 


3ResultSet 接口添加了对行操作的支持(最令人心动之处)

修 改了的记录集接口(ResultSet 接口)的方法,使它支持可以滚动的记录集,即数据库游标可以在返回的记录集对象中自由地向前或向后滚动,或者定位到某个特殊的行。利用ResultSet 接口中定义的新方法,JSP/Servlet 程序员可以用Java语言来更新记录集,比如插入记录,更新某行的数据,而不是靠执行SQL 语句,这样就大大方便了程序员的开发工作,享受Java编程的乐趣了。
ResultSet 接口中新添加的部分方法如下所示:

 

public boolean rowDeleted(); 如果当前记录集的某行被删除了,那么记录集中将会留出一个空位;调用rowDeleted()方法,如果探测到空位的存在,那么就返回true; 如果没有探测到空位的存在,就返回false 值.

 

public boolean rowInserted(); 如果当前记录集中插入了一个新行,该方法将返回true ,否则返回false。

 

public boolean rowUpdated(); 如果当前记录集的当前行的数据被更新,该方法返回true ,否则返回false。

 

public void insertRow(); 该方法将执行插入一个新行到当前记录集的操作。

 

public void updateRow(); 该方法将更新当前记录集当前行的数据。

 

public void deleteRow(); 该方法将删除当前记录集的当前行。

 

public void updateString(int columnIndex ,String x); 该方法更新当前记录集当前行某列的值,该列的数据类型是String(指Java 数据类型是String,与之对应的JDBC 数据类型是VARCHAR 或NVARCHAR 等数据类型) 。该方法的参数columnIndex 指定所要更新的列的列索引,第一列的列索引是1 ,以此类推,第二个参数x 代表新的值,这个方法并不执行数据库操作,需要执行insertRow()方法或者updateRow()方法以后,记录集和数据库中的数据才能够真正更新。

 

public void updateString(String columnName ,String x); 该方法和上面介绍的同名方法差不多,不过该方法的第一个参数是columnName ,代表需要更新的列的列名,而不是columnIndex。

 



4.基本操作:
往数据库当前记录集插入新行的操作流程如下:
1 调用moveToInsertRow()方法;
2 调用updateXXX()方法指定插入行各列的值;
3 调用insertRow()方法往数据库中插入新的行。

更新数据库中某个记录的值(某行的值)的方法是:
1 定位到需要修改的行(使用absolute()relative()等方法定位);
2 使用相应updateXXX()方法设定某行某列的新值;XXX 所代表的Java数据类型,必须可以映射为某列的JDBC数据类型,如果希望rollback 该项操作,请在调用updateRow()方法以前,使用cancelRowUpdates()方法,这个方法可以将某行某列的值复原;
3 使用updateRow()方法完成UPDATE的操作。

删除记录集中某行(亦即删除某个记录)的方法:
1 定位到需要修改的行(使用absolute()relative()等方法定位);
2 使用deleteRow()

删除记录集中某行(亦即删除某个记录)的方法:
1 定位到需要修改的行(使用absolute()relative()等方法定位);
2 使用deleteRow()方法.

 

  • 大小: 6.3 KB
分享到:
评论

相关推荐

    ResultSet

    ResultSet的用法

    ResultSet对象获取数据的各种方法

    这是一个用来教你如何使用ResultSet 获取数据对象的文档,非常使用

    java resultset常用方法

    一些常用的 resultSet用法 ResultSet.TYPE_FORWARD_ONLY:(缺省类型),ResultSet指针只允许向前移动,并且不会受到其他用户对该数据库所作更改的影响。 TYPE_SCROLL_INSENSITIVE:ResultSet指针可以前后移动,甚至...

    关于ResultSet的相关知识

    将列值插入到插入行中。可更新的 ResultSet 对象具有一个与其关联的特殊行,该行用作构建要插入的行的暂存...以下代码片段将光标移动到插入行,构建一个三列的行,并使用方法 insertRow 将其插入到 rs 和数据源表中。

    java sql ResultSet 之getRow()用法说明

    主要介绍了java sql ResultSet 之getRow()用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    Java使用PreparedStatement接口及ResultSet结果集的方法示例

    主要介绍了Java使用PreparedStatement接口及ResultSet结果集的方法,结合实例形式分析了PreparedStatement接口及ResultSet结果集的相关使用方法与操作注意事项,需要的朋友可以参考下

    Blog-Art.-09-Java-ResultSet-To-List:将结果集转换为地图对象列表

    JdbcUtil类与静态方法一起使用。 该项目是使用NetBeans 8开发的。 环聊SpringMVC: ://youtu.be/clBK-R8LChM Spring-MYBATIS: ://youtu.be/-73G1xouigU MYBATIS 01: ://youtu.be/NZozAxF4NWo

    使用JDBC从数据库中查询数据的方法

    * ResultSet 结果集:封装了使用JDBC 进行查询的结果 * 1. 调用Statement 对象的 executeQuery(sql) 方法可以得到结果集 * 2. ResultSet 返回的实际上就是一张数据表,有一个指针指向数据表的第一行的前面, * ...

    jdbcObjectMapper:JDBC ResultSet对象映射器

    假设我们的ResultSet代表这样的列。 这些列是从表的某些联接(付款,用户,公司)中选择的,并且这些列在一个查询结果中:id,payment_date,payment_amount,user_... //如果不是列表,请使用mapRersultSetToObject **

    数据库-数据库编码解决方案

    我们知道进行编码和转码工作都是集中在JDBC的两个接口PreparedStatement和ResultSet上进行的,主要涉及PreparedStatement的setString方法以及ResultSet的getString方法。前面我们讲过需要加入一个连接封装层来对...

    数据库工具类DatabaseUtil.java

    * 返回记录总数, 使用方法: getAllCount("SELECT count(ID) from tableName") 2004-06-09 * 可滚动的 Statement 不能执行 SELECT MAX(ID) 之类的查询语句(SQLServer 2000) * * @param sql * 需要执行的 SQL *...

    JSP分页(技术)代码

     其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中...

    Commons-dbutils1.7 jar包.rar

    query方法后面参数中加一个Connection连接,是在获取不到数据源的情况下,也就是说,QueryRunner的实例化构造函数使用无参的那个,下面我的实现代码就是用的这种方法。 当然还有一种实例化:new QueryRunner(new ...

    JSP分页技术实现.mht

     其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中...

    freemapper:用于生成 ResultSet 映射器类的 Java 注释处理器

    自由映射器FreeMapper 是一个 Java Annotation Processor,它自动生成类,用于从 SQL ResultSet映射到 POJO,无需反射。 传统的 ORM 增加了大量的复杂性,并且会对性能产生巨大影响。 FreeMapper 的目标是在没有任何...

    Spring使用技巧

    --------------=======Spring 使用技巧========------------------- 1.在SSH中的DAO中执行SQL //申请变量 Connection conn = null; PreparementStatement ps = null;......(正常执行SQL,使用方法和JDBC使用方法一致)

    JDBC数据库常用操作封装(升级版)

    看前面的那一版注释,加了同步,线程安全,封装了jdbc常用操作,增删改查,查询ResultSet指定位置的记录,返回ResultSet每个列的名字,查询ResultSet中记录的行数...... 含源代码,测试代码!!!! 另附API说明,powerdesign图,...

    很好的一个jsp分页

     其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中...

    JDBC数据库常用操作封装

    封装了jdbc常用操作,增删改查,查询ResultSet指定位置的记录,返回ResultSet每个列的名字,查询ResultSet中记录的行数...... 含源代码,测试代码!!!! 另附API说明,powerdesign图,mysql/mssql数据库代码. 用户只需使用...

Global site tag (gtag.js) - Google Analytics