`
wangqinqin
  • 浏览: 58887 次
  • 性别: Icon_minigender_2
  • 来自: 江苏
社区版块
存档分类
最新评论

JDBC2.0中的ResultSet新特性

    博客分类:
  • jdbc
阅读更多

可滚动特性和可更新特性:

JDBC1.0中是指游标的移动的方向和方式是单向,单步(相对)移动,功能比较简单。

JDBC2.0中游标可以双向,相对或者绝对移动。

可滚动结果集:这种结果集不但可以双向滚动,相对定位,绝对定位,并且还可以修改数据信息。

1) 滚动特性:

定位函数:

boolean absolute(int row),定位到指定的记录位置。定位成功返回true,不成功返回false

void afterLast(),把游标移动到最后一条记录的后面(逻辑位置)。

void beforeFirst(),把游标移动到第一条记录的前面(逻辑位置)。

//由于第一条记录的前面和最后一条记录的后面这两个位置肯定存在,所以无需判断是否存在,返回值设为void

Boolean first(),把游标定位到第一条记录。

Boolean last(),把游标定位到最后一条记录。

//当结果集为空的时候,这两个方法会返回false

Boolean next(),此方法是使游标向下一条记录移动。

Boolean previous(),此方法可以使游标向上一条记录移动,前提是前面还有记录。

Boolean relative(int rows),相对定位方法,参数值可正可负,参数为正,游标从当前位置向后移动指定值条记录,参数为负,游标从当前位置向前移动指定值条记录。

判断函数:

ifBeforeFirst()判断是否在第一条记录之前。

ifAfterLast()判断是否在最后一条记录之后。

ifFirst()判断是否为第一条记录。

ifLast()判断是否为最后一条记录。

更新特性常量(并发类型)

CONCUR_READ_ONLY并发只读结果集(默认).

            CONCUR_UPDATABLE并发可更新结果集。

滚动特性常量(结果集类型)

            TYPE_FORWARD_ONLY,该常量表示指针只能向前移动的ResultSet对象的类型。(默认)

            TYPE_SCROLL_INSENSITIVE,该常量指示可滚动但通常不受其他影响的ResultSet对象的类型。

            TYPE_SCROLL_SENSITIVE,该常量指示可滚动并且通常受其他更改影响的ResultSet对象的类型。

            //敏感:数据库改变,结果集改变。

 

语法:Statement stm=nullPreparedStatement  pstm=null

stm=con.createStatement(int resultSetType,int resultSetConcurrency);

pstm=con.prepareStatement((String sql,int resultSetType,int resultSetConcurrency); 

2) 可更新特性:

插入某行操作:

a:moveToInsertRow(),记录当前游标位置,将游标移动到和结果集结构类似的缓冲区;

b:使用updateXXXint column,colunmType value)方法来更新指定列数据。

c:使用insertRow()方法插入记录。

d:将游标指回原位,moveToCurrentRow()

删除某行操作:

 a: absolute(int row),将游标移动到指定行。

 b: 使用deleteRow()方法删除记录。

更新某行操作:

 a: absolute(int row),将游标移动到指定行。

b: 使用updateXXXint column,colunmType value)方法来更新指定列数据。

c: 使用updateRow()方法更新指定的行。

能否使用JDBC2.0 ResultSet的新特性,要看使用的数据库驱动是否支持这一新特性。

还有只能用于单表且表中主键字段(可能会是联合主键),不能够有表连接,会取可更新操作必须满足以下条件:

1) 查询只能引用一张表。

2) 不能包含任何连接操作。

3) 必须把完整的主键插到结果集里面。

4) 保证所有字段为非空字段并且没有默认值。

 

使用ResultSet新特性中的只读功能代码如下:
package com.ambow.day21.jdbc.NewFecture;

import java.sql.Array;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.ambow.day19.jdbc.util.JDBCConAndClo;

public class ResultSetConcurReadOnlyTest {
	public static void main(String args[]) {
		Connection con = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		try {
			// 连接数据库
			con = JDBCConAndClo.getConnectionBao();
			// 执行sql语句
			pstm = con.prepareStatement("select * from student order by id",
					ResultSet.TYPE_SCROLL_INSENSITIVE,
					ResultSet.CONCUR_READ_ONLY);// 或用ResultSet.TYPE_SCROLL_SENSITIVE也可以;
			rs = pstm.executeQuery();
			// 移动到数据库第一行first:并按指定的要求查出结果信息;
			System.out.print("这是第一行数据——————");
			rs.first();
			System.out.print(rs.getInt(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getString(3) + " ");
			System.out.println(rs.getInt(4));
			// 移动到数据库最后一行last:并按指定的要求查出结果信息;
			System.out.print("这是最后一行数据——————");
			rs.last();
			System.out.print(rs.getInt(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getString(3) + " ");
			System.out.println(rs.getInt(4));
			// 移动到数据库最后一行之后afterLast:并按指定的要求查出结果信息;
			System.out.print("这是最后一行之后数据——————");
			rs.afterLast();
			System.out.println(rs.isAfterLast());
			// 移动到数据库第一行前面BeforeFirst:并按指定的要求查出结果信息;
			System.out.print("这是第一行之前数据——————");
			rs.beforeFirst();
			System.out.println(rs.isBeforeFirst());
			// 移动到数据库指定的行前absolute:并按指定的要求查出结果信息;
			System.out.print("这是指定行数据——————");			
       rs.absolute(22);
			System.out.print(rs.getInt(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getString(3) + " ");
			System.out.println(rs.getInt(4));
			// int findColumn(String columnLabel)返回:给定列名称的列索引
			System.out.print("这是给出字段得出其在哪一列————");
			String str = "score";
			int i = rs.findColumn(str);
			System.out.println(str + "在第" + i + "列");
			// 将光标移动到此 ResultSet 对象的上一行previous。并按指定的要求查出结果信息
			System.out.print("这是光标上一行数据——————");
			rs.previous();
			System.out.print(rs.getInt(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getString(3) + " ");
			System.out.println(rs.getInt(4));
			// 将光标从当前位置向前移一行next。并按指定的要求查出结果信息。并按指定的要求查出结果信息
			System.out.print("这是光标下一行数据——————");
			rs.next();
			System.out.print(rs.getInt(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getString(3) + " ");
			System.out.println(rs.getInt(4));
			// 按相对行数(或正或负)移动光标relative。并按指定的要求查出结果信息。并按指定的要求查出结果信息
			System.out.print("这是相对行数(或正或负)移动光标数据——————");
			rs.relative(-2);
			System.out.print(rs.getInt(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getString(3) + " ");
			System.out.println(rs.getInt(4));
			// 顺序读取数据库信息:
			System.out.println("顺序读取数据库信息:——————");
			rs.first();
			while(rs.next()){
				System.out.print(rs.getInt(1)+" ");
				System.out.print(rs.getString(2)+" ");
				System.out.print(rs.getString(3)+" ");
				System.out.println(rs.getDouble(4));
			}

			// 逆序读取数据库信息:
			System.out.println("逆序读取数据库信息:——————");
			rs.last();
			while(rs.previous()){
				System.out.print(rs.getInt(1)+" ");
				System.out.print(rs.getString(2)+" ");
				System.out.print(rs.getString(3)+" ");
				System.out.println(rs.getDouble(4));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 关闭连接,释放资源
			JDBCConAndClo.closeResultSet(rs);
			JDBCConAndClo.closePreparedStatement(pstm);
			JDBCConAndClo.closeConnection(con);
		}
	}
}
使用ResultSet新特性中的更新功能代码如下:
package com.ambow.day21.jdbc.NewFecture;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.ambow.day19.jdbc.util.JDBCConAndClo;
import com.ambow.day19.jdbc.util.MySqlDBConnection;

public class ResultSetConcurUpdate {
	public static void main(String args[]) {
		Connection con = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		try {
			// 连接数据库
			// con = JDBCConAndClo.getConnectionBao();//连接Oracle数据库
			con = MySqlDBConnection.DBConnection();//连接MySql数据库

			// 执行sql语句
			pstm = con.prepareStatement("select * from student order by id",
					ResultSet.TYPE_SCROLL_INSENSITIVE,
					ResultSet.CONCUR_UPDATABLE);
			rs = pstm.executeQuery();
			// 删除数据库指定的行
			rs.absolute(3);
			System.out.print(rs.getInt(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getString(3) + " ");
			System.out.println(rs.getInt(4));
			System.out.println("删除数据库指定的行!");
			rs.deleteRow();
			
			//更新一行数据
			rs.next();
			System.out.print(rs.getInt(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getString(3) + " ");
			System.out.println(rs.getInt(4));
			System.out.println("更新一条数据!");
			rs.updateString(3, "baba");
			rs.updateRow();// 更新这一行
		
			//插入新行,可以看成是最后一条记录的下一行,将指针移动到插入行。
			 System.out.println("插入一条数据!");
			 rs.moveToInsertRow();
			 rs.updateInt(1, 9);
			 rs.updateString(2, "h9");
			 rs.updateString(3,"English");
			 rs.updateDouble(4, 88);
			 rs.insertRow();//执行这个方法,就把新的一行插入到数据库里面
			 rs.moveToCurrentRow();
          
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 关闭连接,释放资源
			MySqlDBConnection.closeResultSet(rs);
			MySqlDBConnection.closePreparedStatement(pstm);
			MySqlDBConnection.closeConnection(con);
		}
	}
}

 

<!--EndFragment-->

1
0
分享到:
评论
1 楼 zhxing 2009-12-13  
路过 女孩子编程的还是挺少的。用久了hibernate 都忘了jdbc了,基础还是要学扎实点滴。。lz 还是挺有空的吗,一天写几篇。。哈哈

相关推荐

Global site tag (gtag.js) - Google Analytics