talosのプログラミング教室

Java Gold合格への道 ~JDBC・スクロール~

スポンサーリンク

こんにちは。たろすです。

今回はJDBCにおけるスクロールについて説明します。

使い方

以下のテーブルを使用します。


public class Main {

	public static void main(String[] args) {

		final String URL = "jdbc:mysql://localhost:3306/javagold?characterEncoding=UTF-8";
		final String USER = "****";  // 自身で設定したユーザ名
		final String PASS = "****";  // 自身で設定したパスワード

		try (Connection con = DriverManager.getConnection(URL, USER, PASS);
				Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
				ResultSet rs = st.executeQuery("SELECT * FROM employee")) {
			rs.last(); // 最終行に移動
			System.out.print(rs.getString(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getDate(3) + " ");
			System.out.println(rs.getDate(4) + " ");

			rs.first(); // 先頭行に移動
			System.out.print(rs.getString(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getDate(3) + " ");
			System.out.println(rs.getDate(4) + " ");

			rs.afterLast(); // 最終行の次に移動
			rs.previous(); // 1つ前に移動
			System.out.print(rs.getString(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getDate(3) + " ");
			System.out.println(rs.getDate(4) + " ");

			rs.beforeFirst(); // 先頭行の前に移動
			rs.next(); // 1つ次に移動
			System.out.print(rs.getString(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getDate(3) + " ");
			System.out.println(rs.getDate(4) + " ");

			rs.relative(3); // 3つ順方向に移動
			System.out.print(rs.getString(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getDate(3) + " ");
			System.out.println(rs.getDate(4) + " ");

			rs.relative(-2); // 2つ逆方向に移動
			System.out.print(rs.getString(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getDate(3) + " ");
			System.out.println(rs.getDate(4) + " ");

			rs.absolute(5); // 5番目の行に移動
			System.out.print(rs.getString(1) + " ");
			System.out.print(rs.getString(2) + " ");
			System.out.print(rs.getDate(3) + " ");
			System.out.println(rs.getDate(4) + " ");

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
000006 市川 誠 2022-05-03 1996-12-10 
000001 伊藤 太郎 2022-04-01 1985-11-02 
000006 市川 誠 2022-05-03 1996-12-10 
000001 伊藤 太郎 2022-04-01 1985-11-02 
000004 源田 三郎 2022-05-01 1995-01-08 
000002 坂本 啓介 2022-04-01 1972-05-21 
000005 斉藤 正治 2022-05-01 1991-09-01 


スクロールできるようにするにはcreateStatementメソッドの第一引数でResultSet.TYPE_SCROLL_INSENSITIVEかResultSet.TYPE_SCROLL_SENSITIVEを設定する必要があります。

Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

INSENSITIVEはResultSetのもとになっているデータに対する変更を反映しない、SENSITIVEは反映するという違いがあります。

また、第二引数はResultSetによるレコードの更新可否の有無を指定します。

更新不可にするときはResultSet.CONCUR_READ_ONLY、更新可能にするときはResultSet.CONCUR_UPDATABLEを指定します。

rs.last(); // 最終行に移動

lastメソッドはカーソルを最終行に移動します。

そのため6番目のレコードが表示されます。

rs.first(); // 先頭行に移動

firstメソッドはカーソルを先頭行に移動します。

そのため1番目のレコードが表示されます。

rs.afterLast(); // 最終行の次に移動
rs.previous(); // 1つ前に移動

afterLastメソッドはカーソルを最終行の次に移動します。

また、previousメソッドはカーソルを1つ前に移動します。

そのため最終行のレコードが表示されます。

rs.beforeFirst(); // 先頭行の前に移動
rs.next(); // 1つ次に移動

beforeFirstはカーソルを先頭行の前に移動します。

また、nextメソッドはカーソルを1つ次に移動します。

そのため先頭行のレコードが表示されます。

rs.relative(3); // 3つ順方向に移動

relativeメソッドは引数の数だけカーソルを順方向に移動します。

relativeメソッドを実行する前のカーソルは先頭行を指していたため、4番目のレコードが表示されます。

rs.relative(-2); // 2つ逆方向に移動

relativeメソッドの引数に負の値を入れるとカーソルは逆方向に移動します。

カーソルは4番目を指していたため、2番目のレコードが表示されます。

rs.absolute(5); // 5番目の行に移動

absoluteメソッドは引数に指定された行番号にカーソルを移動させます。

そのため5番目のレコードが表示されます。

おわりに

今回はJDBCにおけるスクロールについて説明しました。