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