转载地址:http://hi.baidu.com/wtx521/item/62f5c8460fc7803bfa8960af
JdbcRowSet对象实际上是一个加强版的ResultSet对象。就像ResultSet对象一样,它维持一个到数据源的连接。最大的不同在于它有一系列的属性设置和一套事件监听机制。JdbcRowSet的最大用途是它使一个原本不支持数据库游标滚动或更新操作的ResultSet具备这些能力。下面介绍如何使用JdbcRowSet对象。
创建JdbcRowSet对象你可以通过两种方法创建JdbcRowSet对象:
1)使用带有ResultSet对象的JdbcRowSet对象的构造函数。
2)使用不带参数的JdbcRowSet对象的构造函数。
下面将详细介绍如何通过以上两种方式创建JdbcRowSet对象。
1. 通过给构造函数传递ResultSet对象
构造JdbcRowSet对象最简单的方法是将一个ResultSet对象传递给JdbcRowSetImpl对象的构造函数,这样做不仅仅创建了一个JdbcRowSet对象,而且还将ResultSet对象的数据导入到此创建的JdbcRowSet对象之中。如下所示:(在下面的代码中变量con是一个Connection对象的实例)
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from COFFES");
JdbcRowSet jdbcRs = new JdbcRowSetImpl(rs);
注意,当在调用createStatement时没有传递任何参数时,对于由此Statement创建的ResultSet对象将不具有滚动或更新功能,只能将数据库的游标向前移动而且不能改变其中的数据。然而,你可以将此rs用jdbcRs修饰,通过修饰的rs将具备以上功能。实际上,当使用此方法构造JdbcRowSet对象时,其构造函数完成了如下属性的设置:
1)type --- ResultSet.TYPE_SCROLLL_INSENSITIVE(使数据集的数据游标可以滚动)
2)concurrency --- ResultSet.CONCUR_UPDATABLE(使数据集中的数据可以更新)
3)escapeProcessing --- true (使Jdbc驱动处理转义符)(the driver will do escape processing)
4) maxRows --- 0 (对数据集的行数没有限制)(no limit on the number of rows)
5)maxFieldSize—0 (对列数据的大小没有限制)(no limit on the number of bytes for a column value;
applies only to columns that store BINARY, VARBINARY, LONGVARBINARY,
CHAR, VARCHAR, and LONGVARCHAR values)
6)queryTimeout—0 (对执行查询的时间没有限制)(has no time limit for how long it takes to execute a query)
7)showDeleted—false (删除的行不可见)(deleted rows are not visible)
8)transactionIsolation—Connection.TRANSACTION_READ_COMMITTED (只从提交的数据集中读取数据)(reads only data that has been committed)
9)typeMap—null (the type map associated with a Connection object used by this RowSet object is null)
2. 使用缺省的构造函数
可以使用如下方式创建一个JdbcRowSet对象:
JdbcRowSet jdbcRs2 = new JdbcRowSetImpl();
为了使jdbcRs2拥有数据,你需要一个携带着目标数据的ResultSet。这意味着你将建立一个Jdbc连接,然后在此连接上执行SQL查询,这些都要求你在此jdbcRs2上合理的设置一些属性以获得连接。为了获得所需数据,你需要设置如下属性:
username --- 数据库用户名
password --- 数据库密码
url --- JDBC 连接串
datasourceName --- 在JNDI服务中注册的DataSource对象的名称。
注意:如果没有使用DataSource对象获取数据源,将不用设置datasourceName属性,只需要设置url属性。
例子:
jdbcRs2.setUsername("yaohai2000");
jdbcRs2.setPassword("secret");
jdbcRs2.setUrl("jdbc:mySubprotocol:mySubname");
你需要设置另外一个重要的属性 command 。这个属性用于执行查询并决定将什么数据装入JdbcRowSet对象之中。例如:
jdbcRs2.setCommand("select * from COFFEES");
一旦你设置好了command属性和用于建立数据库连接的属性,你可以执行下面这个简单的语句将数据库的数据注入到jdbcRs2中:
jdbcRs2.execute();
execute方法将执行许多事情:
1. 使用url、username和password属性和数据库建立连接
2. 执行command属性设置的命令
3. 从一个ResultSet中读出数据将其注入到jdbcRs2中。
在设置command属性时,可以使用SQL的where命令来设置条件以获得所需要的数据,可以按照像"select * from COFFEES where PRICE < 7.99"的语句设置command属性,另外也可以使用"select * from COFFEES where PRICE < ?"的语句设置command属性。其中"?"为占位符,如果使用此方法获取数据,还要在jdbcRs2上设置关于占位符的信息,设置占位符的方法需要两个参数,第一个为此占位符在语句中的位置(从 1 起),第二个为此占位符的值。例如:jdbcRs2.setBigDecimal(1,new BigDecimal("7.99")。
浏览JdbcRowSet对象
1. 逐条浏览JdbcRowSet对象中的数据
while(jdbcRs.next()){
String name = jdbcRs.getString("COF_NAME");
BigDecimal price = jdbcRs.getBigDecimal("PRICE");
System.out.println(name + " " + price);
}
2. 获得任意游标位置的数据
jdbcRs.absolute(4);
jdbcRs.previous();
previous方法和next方法类似,只不过是将游标向前移动一个位置,而next是将游标向后移动一个位置。
3. 将游标置于数据集最后
jdbcRs.afterLast();
4. 将游标置于数据集起始位置
jdbcRs.beforefirst();
更新某列的数据
如果想要更新数据集中第三条记录内容,可以执行:
jdbcRs.absolute(3);
jdbcRs.updateBigDecimal("PRICE",new BigDecimal("10.99"));//更新PRICE列的数值
jdbcRs.updateRow();
插入新数据
jdbcRs.moveToInsertRow();
jdbcRs.updateString("COF_NAME", "House_Blend");
jdbcRs.updateInt("SUP_ID", 49);
jdbcRs.updateBigDecimal("PRICE", new BigDecimal("7.99"));
jdbcRs.updateInt("SALES", 0);
jdbcRs.updateInt("TOTAL", 0);
jdbcRs.insertRow();
jdbcRs.moveToCurrentRow();
jdbcRs.moveToInsertRow();
jdbcRs.updateString("COF_NAME", "House_Blend_Decaf");
jdbcRs.updateInt("SUP_ID", 49);
jdbcRs.updateBigDecimal("PRICE", new BigDecimal("8.99"));
jdbcRs.updateInt("SALES", 0);
jdbcRs.updateInt("TOTAL", 0);
jdbcRs.insertRow();
jdbcRs.moveToCurrentRow();
当你执行inserRow()方法后,新的行会插入到jdbcRs中,同时也写到后台的数据库之中。
删除一条数据
首先移动游标到所要删除的行,然后执行删除方法
jdbcRs.last();
jdbcRs.deleteRow();
完整实例
import java.sql.*;
import javax.sql.rowset.*;
import com.sun.rowset.*;
import java.math.BigDecimal;
public class JdbcRowSetSample {
public static void main(String args[]) {
String strUrl = "jdbc:datadirect:oracle://129.158.229.21:1521;SID=ORCL9";
String strUserId = "scott";
tring strPassword = "tiger";
String className = "com.ddtek.jdbc.oracle.OracleDriver";
JdbcRowSet jdbcRs;
ResultSet rs;
Statement stmt;
Connection con;
BigDecimal b;
try {
Class.forName(className);
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(strUrl, strUserId, strPassword);
con.setAutoCommit(false);
stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
stmt.addBatch("drop table COFFEES");
stmt.addBatch("create table COFFEES(COF_ID INTEGER, " +
"COF_NAME VARCHAR(20), SUP_ID INTEGER, " +
"PRICE DECIMAL(6,2))");
b = new BigDecimal("7.99");
stmt.addBatch("insert into COFFEES values " +
"(1250, ’Colombian’, 101, "+b+")");
b = new BigDecimal("8.99");
stmt.addBatch("insert into COFFEES values " +
"(1300, ’French_Roast’, 49, "+b+")");
b = new BigDecimal("9.99");
stmt.addBatch("insert into COFFEES values " +
"(1800, ’Espresso’, 150, "+b+")");
b = new BigDecimal("8.99");
stmt.addBatch("insert into COFFEES values " +
"(2250, ’Colombian_Decaf’, 101, "+b+")");
stmt.executeBatch();
rs = stmt.executeQuery("select * from COFFEES");
jdbcRs = new JdbcRowSetImpl(rs);
jdbcRs.absolute(3);
jdbcRs.updateBigDecimal("PRICE", new BigDecimal("9.99"));
jdbcRs.updateRow();
jdbcRs.first();
jdbcRs.moveToInsertRow();
jdbcRs.updateString("COF_NAME", "House_Blend");
jdbcRs.updateInt("SUP_ID", 49);
jdbcRs.updateBigDecimal("PRICE", new BigDecimal("7.99"));
jdbcRs.insertRow();
jdbcRs.moveToCurrentRow();
jdbcRs.moveToInsertRow();
jdbcRs.updateString("COF_NAME", "House_Blend_Decaf");
jdbcRs.updateInt("SUP_ID", 49);
jdbcRs.updateBigDecimal("PRICE", new BigDecimal("8.99"));
jdbcRs.insertRow();
jdbcRs.moveToCurrentRow();
jdbcRs.last();
jdbcRs.deleteRow();
con.close();
jdbcRs.close();
} catch(SQLException sqle) {
System.out.println("SQL Exception encountered: " + sqle.getMessage());
}
}
}