l 可滚动特性和可更新特性:
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=null;PreparedStatement pstm=null;
stm=con.createStatement(int resultSetType,int resultSetConcurrency);
pstm=con.prepareStatement((String sql,int resultSetType,int resultSetConcurrency);
2) 可更新特性:
l 插入某行操作:
a:moveToInsertRow(),记录当前游标位置,将游标移动到和结果集结构类似的缓冲区;
b:使用updateXXX(int column,colunmType value)方法来更新指定列数据。
c:使用insertRow()方法插入记录。
d:将游标指回原位,moveToCurrentRow()。
l 删除某行操作:
a: absolute(int row),将游标移动到指定行。
b: 使用deleteRow()方法删除记录。
l 更新某行操作:
a: absolute(int row),将游标移动到指定行。
b: 使用updateXXX(int 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-->