八、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));//返回指定索引的列名和列类型
                }
    }
}

 

 

 

posted @ 2017-08-02 20:28  丶theDawn  阅读(158)  评论(0编辑  收藏  举报