(一)ResultSet
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
默认的 ResultSet
对象不可更新,仅有一个向前移动的光标。因此,只能迭代它一次,并且只能按从第一行到最后一行的顺序进行。但是,可以生成可滚动和/或可更新的 ResultSet
对象。
ResultSet
接口提供用于从当前行获取列值的获取 方法(getBoolean
、getLong
等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为高效。
列从 1 开始编号。
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
// rs will be scrollable, will not show changes made by others,
// and will be updatable
(二)ResultSet静态常量
1、TYPE_FORWARD_ONLY:默认类型,指示光标只能向前移动的 ResultSet
对象的类型。
2、TYPE_SCROLL_INSENSITIVE:该常量指示可滚动并且通常受 ResultSet
底层数据更改影响的 ResultSet
对象的类型。
3、TYPE_SCROLL_SENSITIVE :该常量指示可滚动并且通常受 ResultSet
底层数据更改影响的 ResultSet
对象的类型。
4、CONCUR_READ_ONLY:该常量指示不可以更新的 ResultSet
对象的并发模式。 即只读
5、CONCUR_UPDATABLE:该常量指示可以更新的 ResultSet
对象的并发模式。 可以进行更改
注意:
1.TYPE_FORWORD_ONLY,只可向前滚动;
2.TYPE_SCROLL_INSENSITIVE,双向滚动,但不及时更新,就是如果数据库里的数据修改过,并不在ResultSet中反应出来。
3.TYPE_SCROLL_SENSITIVE,双向滚动,并及时跟踪数据库的更新,以便更改ResultSet中的数据。
(三)处理可滚动的结果集
import java.sql.*;
public class TestScroll {
public static void main(String args[]) {
try {
new oracle.jdbc.driver.OracleDriver();
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
Connection conn = DriverManager
.getConnection(url, "scott", "tiger");
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY); //设置结果集的状态
ResultSet rs = stmt
.executeQuery("select * from emp order by sal");
rs.next();//将光标前移一行
System.out.println(rs.getInt(1));
rs.last(); //光标移到最后一行
System.out.println(rs.getString(1));
System.out.println(rs.isLast());
System.out.println(rs.isAfterLast());
System.out.println(rs.getRow());
rs.previous(); //将光标移到该resultset对象的上一行
System.out.println(rs.getString(1));
rs.absolute(6); //将光标移动到该编号的resultSet对象
System.out.println(rs.getString(1));
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY); //设置结果集的状态
ResultSet rs = stmt
.executeQuery("select * from emp order by sal");
rs.next();//将光标前移一行
System.out.println(rs.getInt(1));
rs.last(); //光标移到最后一行
System.out.println(rs.getString(1));
System.out.println(rs.isLast());
System.out.println(rs.isAfterLast());
System.out.println(rs.getRow());
rs.previous(); //将光标移到该resultset对象的上一行
System.out.println(rs.getString(1));
rs.absolute(6); //将光标移动到该编号的resultSet对象
System.out.println(rs.getString(1));
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
(四)处理可更新的结果集(Oracle的classes12.jar包没有实现该功能)
import java.sql.*;
public class TestUpdataRs {
public static void main(String args[]){
try{
new oracle.jdbc.driver.OracleDriver();
String url="jdbc:oracle:thin:@192.168.0.1:1521:SXT";
Connection conn=DriverManager.getConnection(url,"scott","tiger");
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=stmt.executeQuery("select * from emp2");
rs.next();
//更新一行数据
rs.updateString("ename","AAAA");
rs.updateRow();
//插入新行
rs.moveToInsertRow(); //将光标移动到插入行
rs.updateInt(1, 9999);
rs.updateString("ename","AAAA");
rs.updateInt("mgr", 7839);
rs.updateDouble("sal", 99.99);
rs.insertRow(); //将插入行的内容插入到此resultset对象和数据库中
//将光标移动到新建的行
rs.moveToCurrentRow();
//删除行(光标不位于插入行上时,不能调用此方法)
rs.absolute(5);
rs.deleteRow();
//取消更新
//rs.cancelRowUpdates();
}catch(SQLException e){
e.printStackTrace();
}
}
}
//更新一行数据
rs.updateString("ename","AAAA");
rs.updateRow();
//插入新行
rs.moveToInsertRow(); //将光标移动到插入行
rs.updateInt(1, 9999);
rs.updateString("ename","AAAA");
rs.updateInt("mgr", 7839);
rs.updateDouble("sal", 99.99);
rs.insertRow(); //将插入行的内容插入到此resultset对象和数据库中
//将光标移动到新建的行
rs.moveToCurrentRow();
//删除行(光标不位于插入行上时,不能调用此方法)
rs.absolute(5);
rs.deleteRow();
//取消更新
//rs.cancelRowUpdates();
}catch(SQLException e){
e.printStackTrace();
}
}
}
(五)DataSource
1、作为DriverManager的替代,生成标准的Connection对象
2、连接池实现 (可以调高数据库的连接效率,提高系统的性能)
3、分布式事务实现 (生成一个 Connection
对象,该对象可用于分布式事务,大多数情况下总是参与连接池)
(六)RowSet
1、继承于ResultSet
2、支持断开的结果集
3、支持JavaBean标准