目录:
一、可滚动、可更新的结果集
二、处理Blob类型数据
三、使用ResultSetMetaData分析结果集
可以使用next()、absolute()、afterLast()、previous()等方法自由移动记录指针的ResultSet被称为可滚动的结果集。
以默认方式打开的ResultSet是不可更新的,如果希望创建可更新的ResultSet,则必须在创建Statement或prepareStatement时传入额外参数。Connection在创建Statement或PrepareStatement时还可额外传入如下两个参数:
1、resultSetType:控制ResultSet的类型,该参数可以取如下三个值
(1)ResultSet.TYPE_FORWARD_ONLY:该常量控制记录指针只能向前移动。这是JDK1.4以前的默认值。
(2)ResultSet.TYPE_SCROLL_INSENSITIVE:该常量控制指针可以自由移动(可滚动结果集),但底层数据的改变不会影响ResultSet的内容。
(3)ResultSet.TYPE_SCROLL_SENSITIVE:该常量控制记录指针可以自由记录(可滚动的结果集),而且底层数据的改变会影响ResultSet的内容。
2、resultSetConcurrency:控制ResultSet的并发类型,该参数可以接受如下两个值:
(1)ResultSet.CONCUR_READ_ONLY:该常量指示ResultSet是只读的并发模式(默认)。
(2)ResultSet.CONCUR_UPDATABLE:该常量指示ResultSet是可更新的并发模式。
下面创建一个PreparedStatement对象,由该对象生成的ResultSet对象将是可滚动、可更新的结果集。
1 //使用Connection创建一个PreparedStatement对象 2 //传入控制结果集可滚动、可更新的参数: 3 pstmt=conn.preparedStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
可更新的结果集还需要满足如下两个条件:
★所有数据都应该来自一个表
★选出的数据集必须包含主键列
在创建了可滚动、可更新的ResultSet时,程序可调用ResultSet的updateXxx(int columnIndex,Xxx value)方法来修改执政所指记录、特定列的值,最后调用ResultSet的updateRow()方法来提交修改。
Java 8为ResultSet添加了updateObject(String columnLable,Object x,SQLType targetSqlType)和updateObject(int columnIndex,Object x,SQLType targetSqlObject)两个默认方法,这两个方法可以直接使用Object来修改记录指针所指记录、特定列的值,其中SQLType用于指定该数据列的类型。
下面示范创建这种可滚动、可更新的结果集的方法:
1 package section5; 2 3 import java.io.FileInputStream; 4 import java.sql.Connection; 5 import java.sql.DriverManager; 6 import java.sql.PreparedStatement; 7 import java.sql.ResultSet; 8 import java.util.Properties; 9 10 public class ResultSetTest 11 { 12 private String driver; 13 private String url; 14 private String user; 15 private String pass; 16 public void initParam(String paramFile) 17 throws Exception 18 { 19 //使用Properties类加载属性 20 var props=new Properties(); 21 props.load(new FileInputStream(paramFile)); 22 driver=props.getProperty("driver"); 23 url=props.getProperty("url"); 24 user=props.getProperty("user"); 25 pass=props.getProperty("pass"); 26 } 27 public void query(String sql) 28 throws Exception 29 { 30 //加载驱动 31 Class.forName(driver); 32 try( 33 //创建连接 34 Connection conn= DriverManager.getConnection(url,user,pass); 35 //创建结果集可滚动、可更新的参数 36 PreparedStatement pstmt=conn.prepareStatement(sql, 37 ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); 38 ResultSet rs=pstmt.executeQuery() 39 ) 40 { 41 rs.last();//指针记录定位到最后一行 42 int rowCount=rs.getRow();//查询由多少条记录 43 for(var i = rowCount;i>0;i--) 44 { 45 rs.absolute(i);//将记录指针移动到第i行 46 System.out.println(rs.getString(1)+"\t" 47 +rs.getString(2)+"\t"+rs.getString(3)); 48 //修改记录指针所指记录第二列的值 49 rs.updateString(2,"学生名"+i); 50 //提交修改 51 rs.updateRow(); 52 } 53 } 54 } 55 public static void main(String[] args) 56 throws Exception 57 { 58 var rt=new ResultSetTest(); 59 rt.initParam("src\\mysql.ini"); 60 rt.query("select *from student_table;"); 61 } 62 }