現在の行を管理する
私たちは最初のプログラムを書きましたが、それは完璧に動作しました。クエリを作成して実行すると、その結果、executeQuery()メソッドがオブジェクトを返しました。結果セットクエリのすべての結果を含む 。ここで、そこからこれらの結果を得る方法を考えてみましょう。
クエリの結果には、さまざまな種類の数千の行と数百の列が含まれる可能性があるため、これは思っているほど簡単な作業ではありません。たとえば、画像をデータベースに保存し、バイトのセットとして画像を取得したり、InputStreamとしてダウンロードしたりできます。
ただし、最も単純な「現在の結果行」という概念から始めます。通常、結果には多くの行が含まれるため、オブジェクト結果セット内部に現在の行へのポインタがあります。そして、 next()メソッドを使用して、読み込む行を順次切り替えます。
このアプローチは主に最適化のために行われます。JDBC ドライバーは、文字列を順次読み取るまでデータベースから文字列をロードしない場合があります。あなたもFileInputStream を最初から最後まで順番に読み取ります。したがって、このアプローチは馴染みがあり、理解できるはずです。
ただし、本当に必要な場合は、RandomAccessFileクラスを使用してどこからでもファイルを読み取ることができます。
ResultSetクラスでも同様のことが可能で、結果に沿って現在の行を任意の場所に移動できます。これを行うために、次のメソッドがあります。
方法 | 説明 | |
---|---|---|
1 | 次() | 次の行に切り替える |
2 | 前() | 前の行に切り替える |
3 | isFirst() | 現在の行が最初ですか? |
4 | isBeforeFirst() | 私たちは最初の列の前にいるでしょうか? |
5 | isLast() | 現在の行は最後の行ですか? |
6 | isAfterLast() | 締め切りは過ぎていますか? |
7 | 絶対(int n) | N行目を現在の行にします |
8 | 相対(int n) | 現在の行を N 位置前に移動します。N は 0 未満にすることもできます |
9 | getRow() | 行番号を返します |
方法は非常に単純ですが、2 つの説明が必要です。結果は、いわば、両側が空の線で囲まれたものになります。したがって、最初は現在の行は結果の最初の行より前にあります。最初の行を取得するには、少なくとも 1 回next()メソッドを呼び出す必要があります。
最後の行でnext()メソッドを呼び出した場合は、最後の行の次の行に移動します。データを読み取ることはできませんが、エラーは発生しません。ここで、isAfterLast()メソッドは結果として true を宣言します。
例:
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
System.out.println( results.getRow() ); // 0
System.out.println( results.isBeforeFirst() ); // true
System.out.println( results.isFirst() ); // false
results.next();
System.out.println( results.getRow() ); // 1
System.out.println( results.isBeforeFirst() ); // false
System.out.println( results.isFirst() ); // true
results.next();
System.out.println( results.getRow() ); // 2
System.out.println( results.isBeforeFirst() ); // false
System.out.println( results.isFirst() ); // false
現在の行からデータを取得する
あなたは現在のラインを巧みに管理する方法を学びました。次に、そこからデータを取得する方法を考えてみましょう。このために、オブジェクト結果セット1 つのテンプレートですべてを記述できる特別なメソッドがあります。
getType(numberColumns)
ただし、列に名前がある場合は、列名で取得することもできます。
getType(nameColumns)
例:
while (results.next()) {
Integer id = results.getInt(“id”);
String name = results.getString(“name”);
System.out.println(results.getRow() + ". " + id + "\t"+ name);
}
以下に、SQL データ型と ResultSet メソッドを関連付けるために役立つ表を示します。
SQLデータ型 | getXXX() メソッド |
---|---|
チャー | getString() |
VARCHAR | getString() |
INT | getInt() |
浮く | getDouble() |
クロブ | getClob() |
BLOB | getBlob() |
日にち | getDate() |
時間 | 時間をもらう() |
タイムスタンプ | getタイムスタンプ() |
要点は理解できたと思います。
ResultSet に関するさまざまなデータの取得
現在の行からデータを読み取る方法を、列番号とその名前の両方によって理解しました。ところで、列名を番号で調べるにはどうすればよいでしょうか? それとも結果の列数でしょうか?
一方で、リクエストを書く場合は、これらすべてを知っておく必要があるようです。一方、クエリの結果を画面に表示するプログラムを作成することもできます。クエリが渡され、SQL サーバーが返したすべてを画面 (コンソール、Web ページ) に表示したいだけです。私たちに。
JDBC には、このための特別なオブジェクトであるResultSetMetaDataインターフェイスがあります。このタイプのオブジェクトを取得するのは非常に簡単です。
Statement statement = connection.createStatement();
ResultSet results = statement.executeQuery("SELECT * FROM user");
ResultSetMetaData resultSetMetaData = results.getMetaData();
ResultSetMetaDataインターフェイスには、非常に興味深いメソッドがいくつかあります。最も人気のあるものを以下に示します。
1 | getColumnCount() | 結果の列の数を返します。 |
2 | getColumnName(int 列) | 列名を返します |
3 | getColumnLabel(int 列) | 列の説明を返します |
4 | getColumnType() | 戻り値の列の型: 数値 (特殊コード) |
5 | getColumnTypeName() | 返される列の型: 文字列 |
6 | getColumnClassName() | 列タイプの Java クラス名を返します。 |
7 | getテーブル名() | テーブル名を返します |
8 | getカタログ名() | 列のディレクトリ名を返します。 |
9 | getスキーマ名() | データベースのスキーマ名を返します。 |
10 | isAutoIncrement(int 列) | 列は AUTO INCREMENT をサポートしていますか? |
十一 | isNullable() | 列に NULL を含めることはできますか? |
これを使用して、テーブルについて少し学習してみましょう。
ResultSetMetaData metaData = results.getMetaData();
int columnCount = metaData.getColumnCount();
for (int column = 1; column <= columnCount; column++)
{
String name = metaData.getColumnName(column);
String className = metaData.getColumnClassName(column);
String typeName = metaData.getColumnTypeName(column);
int type = metaData.getColumnType(column);
System.out.println(name + "\t" + className + "\t" + typeName + "\t" + type);
}
重要!列には 1 から番号が付けられていることに注意してください。ちなみに、行も同様です。それはなんと珍しいことでしょうか?
そして、これがプログラムを実行した後に得られた結果です。
「C:\Program Files\Java\jdk-17.0.3.1\bin\java.exe... | |||
ID | java.lang.Integer | INT | 4 |
名前 | java.lang.string | VARCHAR | 12 |
レベル | java.lang.Integer | INT | 4 |
作成日 | java.sql.date | 日にち | 91 |
プロセスは終了コード 0 で終了しました |
GO TO FULL VERSION