ResultSet详解

要读取数据库的数据必须掌握RecordSet 对象的属性和方法。

常用get 方法对行中的数据进行访问
int getInt(int columnIndex)
int getInt(String columnName)
Date getDate(int columnIndex)
Date getDate(String columnName)
Public String getString(int columnIndex)
Public String getString(String columnName)
数据库基本访问格式
Class.forName(“JDBC
驱动程序");
Connection con= DriverManager.getConnection(url);
Statement stmt=conn.createStatement(
结果集类型,结果集并发性);
ResultSet rs=stmt.executeQuery(DQL
语句); 查询
ResultSet rs=stmt.executeUpdate(DML
语句); 操作

结果集

Statement 对象创建的常见用法
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
结果集类型 决定这个Statement 对象创建的Rs 对象是否可以滚动,是否对数据库中的修改敏感。
ResultSet.TYPE_FORWORD_ONLY
(默认值)
ResultSet.TYPE_SCROLL_INSENSITIVE
(可滚动,不敏感)
ResultSet.TYPE_SCROLL_SENSITIVE
(可滚动,敏感)
结果集并发性 决定Rs 是否可以修改数据库中的行。
ResultSet.CONCUR_READ_ONLY
(不可修改默认)
ResultSet.CONCUR_UPDATABLE
(可以修改)
若要使用Rs 更新,可以实现添加、删除和修改。我们使用update 方法更新,包括updateInt/updateDate/updateStringupdate 接受两个参数:

要更新的列
新的值

对敏感与否的解释
rs
对结果集的修改有两种。
内部修改:可更新结果集的修改,指rs 的值变了。
外部修改:其它的程序修改了结果集原来读取的行,指数据库修改了。
由于修改导致结果集和原来的值不同。
修改对结果集的影响如下表:

类型

内部更新

内部删除

内部插入

外部更新

外部删除

外部插入

只向前

可滚动不敏感

可滚动敏感


但是我们可以使用ResultSet 对象的refreshRow() 方法刷新结果集的当前行,覆盖默认的可见性。将所有的否都变为是。
更新:
rs.absolute(3);//
定位更新哪一行
rs.updateInt(“
数学100)// 更新记录集
rs.updateRow();//
将更新发送到数据库
删除:
rs.absolute(3);//
定位要删除的行
rs.deleteRow();//
将删除发送到数据库
添加:
rs.moveToInsertRow();//
首先调用moveToInsertRow() 创建新行
rs.updateInt(“
数学100)// 利用update 设置新行的值
rs.updateString(“
姓名 张三”)
rs.insertRow();//
将新行发送到数据库

光标的维护方法:

JDBC1.0 中,光标只能利用next 方法向前移动一条记录,在2.0 中,增加了可滚动结果集,使其可以任意跳转。
next()
下一条,true/false
previous()
前一条,true/false
first()
第一条true/false
last()
最后一条true/false
beforeFirst()
第一条之前true/false
afterLast()
最后一行后面true/false
absolute(int num)
移动到指定行,若指定为负数,则从最后一行向前移动。
Relative( int relativeRowNumber)
移动到当前行的相对行,参数可以为负数,指当前行之前的行。
在使用可滚动结果集方法移动时,如果不清楚当前位置,可以使用如下方法:
getRow()
返回当前行,若无,则0
isfirst()true/false
isLast() true/false
isBeforeFirst() true/false
isAfterLast() true/false

例:使用javabeanresultSet 读取数据库。

准备:

创建数据库data_2007 ,用户名sa ,密码sa
创建表userlistid,username,addtime
id
int 主键,标识,自动增加1
username
nvarchar
addtime
smalldatetime ,默认值getdate ()
随意添加几条数据用来测试
ceshi_sql.jsp
用来测试sql 是否联结成功
index.jsp
使用了javabean 连接数据库

 

 

 

结果集 (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()
   
最后注意到的是, Connection 物件预设为自动 认可 Commit ),也就是 Statement 执行 SQL 叙述完后,马上对资料库进行操作变 更,如果想要对 Statement 要执行的 SQL 进行除错,可以使用 setAutoCommit(false) 来将自动认可取消,在执行完 SQL 之后,再 呼叫 Connection commit() 方法认可变更,使用 Connection getAutoCommit() 可以测试是否设定为自动认可。
不过无论是否有无执行 commit() 方法,只要 SQL 没有错,在关闭 Statement Connection 前,都会执行认可动作,对资料库进行变更

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值