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番目のレコードが表示されます。