`
xo_tobacoo
  • 浏览: 391886 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

ResultSet参数设置和更新(翻译总结)

    博客分类:
  • java
阅读更多

ResultSet参数设置和更新

ResultSet中保存了 query查询语句执行的结果,因此被用来扫描(检索,定位)数据。不过,也可以用来导航数据和进行个别的更新。接下来我们来看下细节:

一、导航 ResultSet数据

只要数据库允许这些操作,JDBC提供了下面几个方法都可以用来导航ResultSet中数据。

ResultSet’s Methods for Navigating Rows

boolean next();

boolean previous();

boolean first();

boolean last();

void beforeFirst();

void afterLast();

boolean relative(int n);

boolean absolute(int n);

boolean next()游标位置后移一个,如果当前是最后一行了,那么返回false

boolean previous()游标位置前移一个,如果当前是第一行,则返回false

oolean first() 游标位置返回第一行,如果不存在(查询结果为空),那么返回false

boolean last()游标位置返回最后一行,如果不存在(查询结果为空),那么返回fals

void beforeFirst()返回到最开始,它的下一行是第一行数据。

void afterLast()返回到最后,它的上一行是最后一行数据

boolean relative(int n) 以当前位置为基准,跳n个位置,如果n为正那么往后移动n行,如果为负那往前移动n行。

boolean absolute(int n)为正,则以第一行为基准,跳到第n行,为负,则从最后一行往前跳n行.

二、ResultSet的三种类型参数

缺省情况下创建的ResultSet 是一种只能访问一次(one-time-through),只能向前访问(forward-only),只读的对象。您只能访问数据一次,如果再次需要该数据,必须重新查询数据库。

ResultSet.TYPE_SCROLL_SENSITIVE

双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。(其它人对记录的修改会反应到你打开的记录集   敏感)

ResultSet.TYPE_SCROLL_INSENSITIVE

双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。允许在列表中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。(其它人对记录的修改不会反应到你打开的记录集   不敏感)

TYPE_FORWORD_ONLY

只可向前滚动。缺省类型,不会受到其他用户对该数据库所作更改的影响。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。

.
三、ResultSet 和事务处理参数

ResultSet 一般会被关闭,在事务的commit 或者 rollback被执行后.但是有时候你要保留ResultSet继续被使用怎么办?看下面参数:

HOLD_CURSORS_OVER_COMMIT: ResultSet的数据仍然可以被存取在commit 或者 rollback之后.
CLOSE_CURSORS_AT_COMMIT: ResultSet的数据被抛弃在 commits 或者 rollbacks执行后.
四、 并发性参数

ResultSet 的数据可以被更新的,为了达到这个目的要做的一件事情就是和数据库保持连接,然后就是使用一些锁机制在更新期间保护数据。并发等级参数有下面两个:

CONCUR_READ_ONLY: 不允许更新
CONCUR_UPDATABLE: 允许并发同步更新数据
五、参数的设置方法:

java.sql.Connection 在使用createStatement(), prepareStatement(), 和 prepareCall() 方法的时候设置参数:

Statement createStatement(int resultSetType, int concurrencyLevel)

Statement createStatement(int resultSetType, int concurrencyLevel,

 int resultSetHoldability)

PreparedStatement prepareStatement(String sql, int resultSetType,

 int concurrencyLevel)

PreparedStatement prepareStatement(String sql, int resultSetType,

 int concurrencyLevel, int resultSetHoldability)

CallableStatement prepareCall(String sql, int resultSetType, int concurrencyLevel)

CallableStatement prepareCall(String sql, int resultSetType,

 int concurrencyLevel, int resultSetHoldability)

六、不使用游标更新数据

Listing 7-8: Updating a ResultSet without Using Cursors


 

// updating resultsets

import java.sql.*;

class SimpleExample

{

         public static void main(String args[])

         {

                 String url = "jdbc:odbc:mysource";

                 try

                 {

                          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

                          Connection myConnection =

                                  DriverManager.getConnection(url, "javauser",

                                  "hotjava");

                          Statement stmt = myConnection.createStatement(

ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

                          ResultSet rs = stmt.executeQuery("SELECT phone FROM

                          employees WHERE location = ‘Paris’");

                          while (rs.next()) {

                                  String phone = rs.getString(1);

                                  if (!phone.equals("")) {

                                           // add a telephone prefix

                                           rs.updateString("phone", "+31 " +

                                           phone);

                                           rs.updateRow();

                                  }

                          }

                          rs.close();

                          stmt.close();

                          myConnection.close();

                 }

                 catch(java.lang.Exception ex)

                 {

                          ex.printStackTrace();

                 }

         }

}

也可以删除更新数据。

It is also possible to delete rows and insert rows using the ResultSet interface. Deleting a row is performed with ResultSet.deleteRow(). The current position within the ResultSet will be set after the row just deleted. Inserting a row is performed with ResultSet.moveToInsertRow(), which actually creates a logical row in the result set. Using the updateXXX() methods on this row sets values for each column in that row. ResultSet.insertRow() is then used to physically send that row to the database.

七、使用游标更新数据

使用游标的条件:

有SELECT语句
有一个名字
有一个位置
根据游标的名字来更新和删除ResultSet中的数据
游标机制 Figure 7-1.见附件


Figure 7-1: The cursor mechanism.

怎么样使用游标

void ResultSet.setCursorName(String name);

String ResultSet.getCursorName();

boolean DatabaseMetaData.supportsPositionedDelete();

boolean DatabaseMetaData.supportsPositionedUpdate();

supportsPositionedDelete():如果支持位置的delete语句,那么返回true

supportsPositionedUpdate():如果支持位置的update语句,那么返回true.

例子:

Listing 7-9: A Positioned Delete


 

// cursors: positioned delete

import java.sql.*;

class SimpleExample

{

        public static void main(String args[])

        {

                String url = "jdbc:odbc:mysource";

                try

                {

                         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

                         Connection myConnection =

                         DriverManager.getConnection(url, "javauser", "hotjava");

                         Statement firstStmt = myConnection.createStatement();

                         Statement secondStmt = myConnection.createStatement();

 

                         ResultSet rs = firstStmt.executeQuery(

                         "SELECT * FROM employees FOR UPDATE");

 

                         String cursor = rs.getCursorName();

 

                         // scan the resultset

                         while (rs.next())

                         {

                                 String phone = rs.getString("phone");

                                 // activate positioned delete

                                 // for employees outside of Belgium and France

                                 if (!phone.startsWith("+31") ||

                                 !phone.startsWith("+32"))

                                 {

                                          secondStmt.executeUpdate(

                                          "DELETE employees WHERE CURRENT OF " +

                                          cursor);

                                 }

                         }

                         rs.close();

                         firstStmt.close();

                         secondStmt.close();

                          myConnection.close();

                 }

                 catch(java.lang.Exception ex)

                 {

                          ex.printStackTrace();

                 }

         }

}


 

 

 
 

Listing 7-10: A Positioned Update


 

// cursors: positioned update

import java.sql.*;

class SimpleExample

{

        public static void main(String args[])

        {

                String url = "jdbc:odbc:mysource";

                try

                {

                         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

                         Connection myConnection =

                         DriverManager.getConnection(url,

                         "javauser", "hotjava");

                         Statement firstStmt = myConnection.createStatement();

                         Statement secondStmt = myConnection.createStatement();

 

                         ResultSet rs = firstStmt.executeQuery("SELECT * FROM

                         employees FOR UPDATE");

 

                         String cursor = rs.getCursorName();

 

                         // scan the resultset

                         while (rs.next())

                         {

                                 String phone = rs.getString("phone");

                                 // activate positioned update

                                 // to convert salary to EURO currency

                                 if (phone.startsWith("+31"))

                                 {

                                          secondStmt.executeUpdate(

                                          "UPDATE employees SET salary = salary /

                                          6.666 WHERE CURRENT OF " + cursor);

                                 }

                                 else if (phone.startsWith("+32"))

                                 {

                                          secondStmt.executeUpdate(

                                          "UPDATE employees SET salary = salary /

                                          40.000 WHERE CURRENT OF " + cursor);

                                 }

                         }

                         rs.close();

                         firstStmt.close();

                         secondStmt.close();

                         myConnection.close();

                }

                catch(java.lang.Exception ex)

                {

                         ex.printStackTrace();

                }

        }

}

 

  • 描述: 游标机制 Figure 7-1.
  • 大小: 52.3 KB
3
1
分享到:
评论
1 楼 kaituozhe6666 2008-07-05  

相关推荐

    ResultSet

    8. 游标属性:可以通过设置Statement的游标属性(如CONCUR_READ_ONLY和CONCUR_UPDATABLE)来控制ResultSet是否可滚动和更新。默认情况下,ResultSet是只读且不可滚动的。 9. 非滚动与滚动ResultSet:非滚动...

    ResultSet 转为listmap

    为了方便数据处理和使用,我们需要将 ResultSet 转为 List,以便于后续的数据处理和展示。 下面是将 ResultSet 转为 List<Map> 的实现代码: ```java public static List,Object>> ResultSetToList(ResultSet rs) ...

    支持ResultSet的JTable

    6. **设置JTable**:最后,将创建的`TableModel`设置给`JTable`的`setModel()`方法,这样`JTable`就会显示来自`ResultSet`的数据。 在提供的文件列表中,`vTable.java`和`Frame1.java`可能是实现这个功能的源代码。...

    java数据库连接ResultSet

    另外,ResultSet还提供了获取列信息的方法,例如 getMetaData,可以用来获取 ResultSet 对象各列的编号、类型和属性。如果列名已知,但不知其索引,则可以使用 findColumn 方法来获取其列号。 在使用 getXXX 方法时...

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

    `ResultSetMetaData`接口提供了有关`ResultSet`对象的信息,包括列的数量、类型和属性。`getMetaData()`方法用于获取此元数据对象。以下代码展示了如何使用`ResultSetMetaData`来获取列名: ```java ...

    javaResultSet常用方法.pdf

    ResultSet对象提供了许多有用的方法来处理查询结果,以下是Java ResultSet常用方法的总结。 创建Statement对象 在使用ResultSet之前,需要首先创建一个Statement对象,该对象将生成具有给定类型和并发性的...

    ResultSet的属性

    ResultSet是Java数据库连接(JDBC)中的一个重要接口,它用于存储和检索数据库查询结果。当执行SQL查询后,结果会被封装成ResultSet对象,允许我们逐行遍历并访问查询返回的数据。在处理ResultSet时,了解其属性和元...

    JAVA 版本ResultSet 转换为JAVABEAN的工具类

    这个工具类通常包含一个静态方法,接受ResultSet和JavaBean类型作为参数,然后遍历ResultSet,将数据填充到JavaBean对象中: ```java import java.sql.ResultSet; import java.sql.SQLException; public class ...

    ResultSet转化为json,json转化为List

    在Java编程中,数据处理是核心任务之一,而ResultSet、JSON和List是处理数据时常见的三种数据结构。ResultSet是数据库查询结果的载体,JSON是一种轻量级的数据交换格式,而List是Java集合框架中的动态数组。本文将...

    ResultSet常用方法

    ResultSet是Java数据库连接(JDBC)...在创建Statement或PreparedStatement对象时,通过设置适当的参数(如`ResultSet.TYPE_SCROLL_INSENSITIVE`,`ResultSet.CONCUR_UPDATABLE`等)来创建可滚动和可更新的ResultSet。

    ResultSet用法集锦

    你可以通过设置`Statement`的属性来改变`ResultSet`的行为,例如设置其类型和并发性。 8. 实用工具和库: 一些第三方库如Apache Commons DBUtils提供了便捷的方法来处理`ResultSet`,如`QueryRunner`类,它可以简化...

    poi根据ResultSet到处Excle源码

    在Java中,ResultSet是执行SQL查询后返回的结果集,它提供了遍历和访问数据库查询结果的方法。将ResultSet转换为Excel,首先需要创建一个HSSFWorkbook对象(对于.xls文件)或XSSFWorkbook对象(对于.xlsx文件),...

    如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回.doc

    总结来说,从Java存储过程返回JDBC ResultSet作为REF CURSOR,主要是为了解决Oracle数据库的特性和JDBC的兼容问题。通过Oracle9i引入的特性,开发者可以利用这种方法在PL/SQL和Java之间更灵活地交换数据。然而,这种...

    java resultset常用方法

    通过`Statement`接口的`createStatement`方法创建Statement对象时,可以通过传递`resultSetType`和`resultSetConcurrency`参数来控制ResultSet的行为。 - **resultSetType**:定义ResultSet的类型,可以是`...

    关于ResultSet的相关知识

    本文将深入探讨ResultSet的两个关键特性:更新当前行的列值和使用插入行来添加新记录。 1. 更新当前行的列值: 当处理可更新的ResultSet时,我们可以修改当前行中的数据并保存这些更改到数据源。在给定的示例中,`...

    resultset2xml

    总的来说,"resultset2xml"涉及到数据库操作、Java编程、XML序列化和数据转换等多方面的知识。理解这个过程对于开发处理数据库数据和跨系统数据交换的软件至关重要。无论是手动编写转换逻辑,还是利用现有库,都需要...

    JDBC和Oracle的参数设置和调用技术.pdf

    《JDBC和Oracle的参数设置和调用技术》这篇文献主要探讨了如何通过Java的JDBC接口调用Oracle数据库中的存储过程,以及不同类型的参数设置和处理方法。Oracle的存储过程是预编译的代码块,能提升系统性能,减少网络...

    jsp 三种查询分页 resultset,hibernate ,存储过程

    jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程

    ResultSet_to_json.jar

    标题“ResultSet_to_json.jar”指的是一个Java应用程序,其主要功能是将数据库查询结果集(ResultSet)以及List等数据结构转换为JSON(JavaScript Object Notation)格式的字符串。JSON是一种轻量级的数据交换格式,...

    ResultSet剖析

    - `resultSetType`:设置`ResultSet`的滚动模式,`ResultSet.TYPE_FORWARD_ONLY`表示仅支持前向滚动,`ResultSet.TYPE_SCROLL_INSENSITIVE`和`ResultSet.TYPE_SCROLL_SENSITIVE`则允许双向滚动,区别在于后者对数据...

Global site tag (gtag.js) - Google Analytics