JavaA2Z

KAB-studio > プログラミング > JavaA2Z > ResultSetとは

ResultSet

日本語 結果集
英語 result set
ふりがな りざるとせっと
フリガナ リザルトセット

解説

SELECT後にデータを取得するためのインターフェイス
J2SEに含まれるインターフェイスのひとつ。パッケージも含めたインターフェイス名はjava.sql.ResultSet。
 
SQLSELECT文を実後、実際に各のデータを取得するためのインターフェイス
StatementインターフェイスexecuteQuery()メソッドか、PreparedStatementインターフェイスexecuteQuery()メソッド戻り値として取得する。
 
ResultSetインターフェイスは「取得する」を内部に持っており、最初この「取得する」は「一番最初ののひとつ前の」となっている。
この「取得する」はnext()メソッドで1進めることができる。そのため、まず最初にnext()メソッド呼び出す。1しか返らないことが判っているSQLを実する場合にnext()メソッドを呼び忘れやすいので注意。また、next()メソッドは「もう次のがない」状態で呼び出すfalseを返すため、これをループの終了条件にする。
実際の値の取得はgetString()メソッド等で取得する。このメソッド名もしくはインデックスナンバーを指定し、「取得する」の指定したのデータを取り出すことができる。インデックスナンバーを指定する場合、最初のは1であり、配列等とは異なるため注意。また、が異なっている場合にはSQLException例外投げられるため注意。
 
使用後は必ずclose()メソッド呼び出し終了処理をう。このメソッド呼び出しは、呼び出し忘れを避けるため必ずfinally内でう。
決して、close()メソッド呼び出す前に新たにResultSetインターフェイス参照を上書きしてはならない。このような理由によりclose()メソッドを呼び出さないResultSetインターフェイスインスタンスが残ると、メモリ等の資源が解放されず、後に致命的な問題となり異常終了する可能性もある。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Sample
{
    public static void main( String[] args )
    {
        Connection conn = null;
        PreparedStatement psCreate = null;
        PreparedStatement psInsert = null;
        Statement stmt = null;
        ResultSet rs = null;
        try
        {
            // この使用例の使用方法についてはSQLの項目を参照してください。
            
            // JDBCドライバをロードします。
            Class.forName( "org.hsqldb.jdbcDriver" );
            
            // コネクションを取得します。
            String url = "jdbc:hsqldb:mem:aname";
            String user = "sa";
            String password = "";
            conn = DriverManager.getConnection( url, user, password );

            // テーブルを作ります。
            // このテーブルに、各行が追加されていきます。
            psCreate = null;
            final String SQL_CREATE = "CREATE TABLE TABLE_TEST( NAME VARCHAR, VALUE INT );";
            psCreate = conn.prepareStatement( SQL_CREATE );
            psCreate.execute();

            // 行を追加します。
            final String SQL_INSERT = "INSERT INTO TABLE_TEST VALUES( ?, ? );";
            psInsert = conn.prepareStatement( SQL_INSERT );
            forint iF1 = 0; iF1 < 3; ++iF1 )
            {
                // 列をインデックスナンバーで指定します。
                // 1から始まるので注意。
                // NAME列はVARCHAR型なので文字列をセットします。
                psInsert.setString( 1, "ネーム" + iF1 );
                // VALUE列はINT型なので整数値をセットします。
                psInsert.setInt( 2, iF1 );
                // execute()メソッドでSQLを実行して、行を追加します。
                psInsert.execute();
                // 基本的に、下に追加されていくイメージです。
            }

            // データを取得します。
            stmt = conn.createStatement();
            final String SQL_SELECT = "SELECT NAME, VALUE FROM TABLE_TEST;";
            rs = stmt.executeQuery( SQL_SELECT );
            // ResultSetインターフェイスのnext()メソッドを呼び出すと1行ずつ取得できます。
            // ResultSetインターフェイス内に「カレントの行」が格納されていて、
            // next()メソッドを呼ぶことでその行が1つずつ増えていきます。
            try
            {
                // 一度もnext()メソッドを呼び出さずにgetString()メソッド等
                // を呼び出すと例外が投げられます。
                rs.getString( "NAME" );
            }
            catch( Exception e )
            {
                e.printStackTrace();
                // java.sql.SQLException: No data is available
                //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcResultSet.checkAvailable(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcResultSet.getColumnInType(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcResultSet.getString(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcResultSet.getString(Unknown Source)
                //     at Sample.main(Sample.java:62)
            }

            // というわけで、まずnext()メソッドを呼び出して、そのあとも
            // 1行ごとに呼び出します。もう行がないとfalseを返します。
            while( rs.next() )
            {
                // 行を進めてから、getString()メソッド等で取得します。
                // 基本的に行を逆には進めません。絶対できないわけではないですが。

                // NAME列から文字列として取得します。
                String name = rs.getString( "NAME" );
                // VALUE列から整数値として取得します。
                int value = rs.getInt( "VALUE" );

                // 列名ではなくインデックスナンバーでも取得できます。
                // ただし、最初の列は1です。
                name = rs.getString( 1 );

                // 列名を間違えると例外が投げられます。
                try
                {
                    // 一度もnext()メソッドを呼び出さずにgetString()メソッド等
                    // を呼び出すと例外が投げられます。
                    rs.getString( "NAMAAAA" );
                }
                catch( Exception e )
                {
                    e.printStackTrace();
                    // java.sql.SQLException: Column not found: NAMAAAA
                    //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.findColumn(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.getString(Unknown Source)
                    //     at Sample.main(Sample.java:94)
                }

                // 型を間違えると例外が投げられます。
                try
                {
                    // 一度もnext()メソッドを呼び出さずにgetString()メソッド等
                    // を呼び出すと例外が投げられます。
                    rs.getInt( "NAME" );
                }
                catch( Exception e )
                {
                    e.printStackTrace();
                    // java.sql.SQLException: Wrong data type: type: VARCHAR (12) expected: INTEGER value: ネーム2
                    //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.getColumnInType(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.getInt(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.getInt(Unknown Source)
                    //     at Sample.main(Sample.java:119)
                }

                System.out.println( name + ", " + value );
            }
            // ネーム0, 0
            // ネーム1, 1
            // ネーム2, 2
        } 
        catch( SQLException e ) 
        {
            // SQLの実行で問題があった場合に投げられます。
            e.printStackTrace();
        }
        catch( ClassNotFoundException e ) 
        {
            // JDBCドライバが存在しなかった場合に投げられます。
            e.printStackTrace();
        }
        finally
        {
            if( rs != null )
            {
                try
                {
                    rs.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }

            if( stmt != null )
            {
                try
                {
                    stmt.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }

            if( psInsert != null )
            {
                try
                {
                    psInsert.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }

            if( psCreate != null )
            {
                try
                {
                    psCreate.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }

            if( conn != null )
            {
                try
                {
                    conn.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }
        }
    }
}
// Sample.java
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Sample
{
    public static void main( String[] args )
    {
        Connection conn = null;
        PreparedStatement psCreate = null;
        PreparedStatement psInsert = null;
        Statement stmt = null;
        ResultSet rs = null;
        try
        {
            // この使用例の使用方法についてはSQLの項目を参照してください。
            
            // JDBCドライバをロードします。
            Class.forName( "org.hsqldb.jdbcDriver" );
            
            // コネクションを取得します。
            String url = "jdbc:hsqldb:mem:aname";
            String user = "sa";
            String password = "";
            conn = DriverManager.getConnection( url, user, password );

            // テーブルを作ります。
            // このテーブルに、各行が追加されていきます。
            psCreate = null;
            final String SQL_CREATE = "CREATE TABLE TABLE_TEST( NAME VARCHAR, VALUE INT );";
            psCreate = conn.prepareStatement( SQL_CREATE );
            psCreate.execute();

            // 行を追加します。
            final String SQL_INSERT = "INSERT INTO TABLE_TEST VALUES( ?, ? );";
            psInsert = conn.prepareStatement( SQL_INSERT );
            for( int iF1 = 0; iF1 < 3; ++iF1 )
            {
                // 列をインデックスナンバーで指定します。
                // 1から始まるので注意。
                // NAME列はVARCHAR型なので文字列をセットします。
                psInsert.setString( 1, "ネーム" + iF1 );
                // VALUE列はINT型なので整数値をセットします。
                psInsert.setInt( 2, iF1 );
                // execute()メソッドでSQLを実行して、行を追加します。
                psInsert.execute();
                // 基本的に、下に追加されていくイメージです。
            }

            // データを取得します。
            stmt = conn.createStatement();
            final String SQL_SELECT = "SELECT NAME, VALUE FROM TABLE_TEST;";
            rs = stmt.executeQuery( SQL_SELECT );
            // ResultSetインターフェイスのnext()メソッドを呼び出すと1行ずつ取得できます。
            // ResultSetインターフェイス内に「カレントの行」が格納されていて、
            // next()メソッドを呼ぶことでその行が1つずつ増えていきます。
            try
            {
                // 一度もnext()メソッドを呼び出さずにgetString()メソッド等
                // を呼び出すと例外が投げられます。
                rs.getString( "NAME" );
            }
            catch( Exception e )
            {
                e.printStackTrace();
                // java.sql.SQLException: No data is available
                //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcResultSet.checkAvailable(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcResultSet.getColumnInType(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcResultSet.getString(Unknown Source)
                //     at org.hsqldb.jdbc.jdbcResultSet.getString(Unknown Source)
                //     at Sample.main(Sample.java:62)
            }

            // というわけで、まずnext()メソッドを呼び出して、そのあとも
            // 1行ごとに呼び出します。もう行がないとfalseを返します。
            while( rs.next() )
            {
                // 行を進めてから、getString()メソッド等で取得します。
                // 基本的に行を逆には進めません。絶対できないわけではないですが。

                // NAME列から文字列として取得します。
                String name = rs.getString( "NAME" );
                // VALUE列から整数値として取得します。
                int value = rs.getInt( "VALUE" );

                // 列名ではなくインデックスナンバーでも取得できます。
                // ただし、最初の列は1です。
                name = rs.getString( 1 );

                // 列名を間違えると例外が投げられます。
                try
                {
                    // 一度もnext()メソッドを呼び出さずにgetString()メソッド等
                    // を呼び出すと例外が投げられます。
                    rs.getString( "NAMAAAA" );
                }
                catch( Exception e )
                {
                    e.printStackTrace();
                    // java.sql.SQLException: Column not found: NAMAAAA
                    //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.findColumn(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.getString(Unknown Source)
                    //     at Sample.main(Sample.java:94)
                }

                // 型を間違えると例外が投げられます。
                try
                {
                    // 一度もnext()メソッドを呼び出さずにgetString()メソッド等
                    // を呼び出すと例外が投げられます。
                    rs.getInt( "NAME" );
                }
                catch( Exception e )
                {
                    e.printStackTrace();
                    // java.sql.SQLException: Wrong data type: type: VARCHAR (12) expected: INTEGER value: ネーム2
                    //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcUtil.sqlException(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.getColumnInType(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.getInt(Unknown Source)
                    //     at org.hsqldb.jdbc.jdbcResultSet.getInt(Unknown Source)
                    //     at Sample.main(Sample.java:119)
                }

                System.out.println( name + ", " + value );
            }
            // ネーム0, 0
            // ネーム1, 1
            // ネーム2, 2
        } 
        catch( SQLException e ) 
        {
            // SQLの実行で問題があった場合に投げられます。
            e.printStackTrace();
        }
        catch( ClassNotFoundException e ) 
        {
            // JDBCドライバが存在しなかった場合に投げられます。
            e.printStackTrace();
        }
        finally
        {
            if( rs != null )
            {
                try
                {
                    rs.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }

            if( stmt != null )
            {
                try
                {
                    stmt.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }

            if( psInsert != null )
            {
                try
                {
                    psInsert.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }

            if( psCreate != null )
            {
                try
                {
                    psCreate.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }

            if( conn != null )
            {
                try
                {
                    conn.close();
                }
                catch( SQLException e )
                {
                    // 各close()メソッドからもSQLException例外が
                    // 投げられるので、拾っておきます。
                    e.printStackTrace();
                }
            }
        }
    }
}

この単語を含むページ

「みだし」に含まれているページ

「解説」に含まれているページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/05/25
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。