八、JDBC——3-管理结果集
3-管理结果集
1.可滚动、可更新的结果集
(1)可以使用absolute()、previous()、afterLast()等方法自由移动记录指针的ResultSet被称为可滚动的结果集;
(2)以默认方式打开的ResultSet是不可更新的,如果希望创建可更新的ResultSet则必须在创建Statement或者PreparedStatement时传入额外的参数:
resultSetType:控制ResultSet的类型,改参数可传入如下三个常量;
ResultSet.TYPE_FORWARD_ONLY:该常量控制指针只能向前移动;
ResultSet.TYPE_SCROLL_INSENSITIVE:该常量控制指针可以自由移动,底层数据改变不会影响ResultSet内容;
ResultSet.TYPE_SCROLL_SENSITIVE:该常量控制指针可以自由移动,底层数据改变会影响ResultSet内容;
resultSetConcurrency:控制ResultSet的并发类型,该参数可传入如下两个常量:
ResultSet.CONCUR_READ_ONLY:该常量指示ResultSet是只读的并发模式;
ResultSet.CONCUR_UPDATABLE:该常量指示ResultSet是可更新的并发模式;
(3)可更新的结果集需要满足如下两个条件:
1)所有数据应该来自一个表;
2)选出的数据必须包含主键列;
(4)创建、使用可滚动可更新的结果集:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class ResultSetTest { public static void main(String[] args) throws Exception { //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //使用DriverManager创建Connection Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "stx12345"); //使用Connection创建一个PreparedStatement //结果集是可滚动、可更新的 PreparedStatement prep = conn.prepareStatement( "select * from test2", //sql ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); //获取结果集 ResultSet rs = prep.executeQuery(); rs.last(); int rowCount = rs.getRow(); for(int i=rowCount;i>0;i--){ rs.absolute(i); System.out.println(rs.getInt(1)+"|"+rs.getString(2)+"|"+rs.getString(3)); //修改 rs.updateString(2, "newName"); //提交修改 rs.updateRow(); } } }
2.使用ResultSetMetaData分析结果集
(1)使用ResultSetMetaData获取关于ResultSet的描述信息;
(2)ResultSetMetaData获取ResultSet的描述信息需要一定的系统开销,所以在已知ResultSet的信息时,不要使用ResultSetMetaData来再次获取ResultSet的信息;
(3)使用ResultSetMetaData分析结果集
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; public class ResultSetMetaDataTest { public static void main(String[] args)throws Exception { //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //使用DriverManager创建Connection Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test", "root", "stx12345"); //使用Connection创建一个PreparedStatement //结果集是可滚动、可更新的 PreparedStatement prep = conn.prepareStatement( "select * from test2", //sql ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); //获取结果集 ResultSet rs = prep.executeQuery(); //获取ResultSetMetaData ResultSetMetaData rm = rs.getMetaData(); //返回结果集的列数量 System.out.println(rm.getColumnCount()); for(int i=1;i<=rm.getColumnCount();i++){ System.out.println(rm.getColumnName(i)+":"+rm.getColumnType(i));//返回指定索引的列名和列类型 } } }