MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

JDBCの結果セット(ResultSet)には何種類ある?前方専用と双方向の違いを解説

JDBCの結果セット(ResultSet)には、「前方専用(forward only)」と「双方向(bidirectional)」の2種類があります。本記事では、それぞれの特徴と使い方をサンプルコード付きでわかりやすく解説します。

前方専用ResultSet(Forward Only ResultSet)とは

カーソルが一方向(前方)にしか移動できないResultSetオブジェクトを「前方専用ResultSet」と呼びます。JDBCでは、デフォルトで作成される結果セットはこの前方専用タイプです。

前方専用ResultSetのカーソルは、ResultSetインターフェースのnext()メソッドを使って移動します。このメソッドは、現在位置から次の行へポインタを進め、boolean値を返します。現在位置より先に行が存在しない場合はfalseを、存在する場合はtrueを返します。

そのため、whileループの中でこのメソッドを利用すれば、ResultSetオブジェクトの内容を先頭から順に反復処理することができます。

while(rs.next()){
}

サンプルコード

以下のような内容の「dataset」テーブルがあると仮定します。

+--------------+-----------+
| mobile_brand | unit_sale |
+--------------+-----------+
| Iphone       |      3000 |
| Samsung      |      4000 |
| Nokia        |      5000 |
| Vivo         |      1500 |
+--------------+-----------+

次の例では、Datasetテーブルからすべてのレコードを取得し、結果を表示しています。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class RetrievingData {
    public static void main(String args[]) throws Exception {
        // ドライバの登録
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        // 接続の確立
        String mysqlUrl = "jdbc:mysql://localhost/TestDB";
        Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
        System.out.println("Connection established......");
        // Statementオブジェクトの作成
        Statement stmt = con.createStatement();
        // データの取得
        ResultSet rs = stmt.executeQuery("select * from Dataset");
        System.out.println("Contents of the table");
        while(rs.next()) {
            System.out.print("Brand: "+rs.getString("Mobile_Brand")+", ");
            System.out.print("Sale: "+rs.getString("Unit_Sale"));
            System.out.println("");
        }
    }
}

実行結果

Connection established......
Contents of the table
Brand: Iphone, Sale: 3000
Brand: Samsung, Sale: 4000
Brand: Nokia, Sale: 5000
Brand: Vivo, Sale: 1500

双方向ResultSet(Bidirectional ResultSet)とは

カーソルが前方向・後方向の両方に移動できるResultSetオブジェクトを「双方向ResultSet」と呼びます。

ConnectionインターフェースのcreateStatement()メソッドには、結果セットのタイプ(resultSetType)と並行処理のタイプ(resultSetConcurrency)を表す2つのint値を受け取るバリアントが用意されています。

Statement createStatement(int resultSetType, int resultSetConcurrency)

双方向の結果セットを作成するには、タイプとしてResultSet.TYPE_SCROLL_SENSITIVEまたはResultSet.TYPE_SCROLL_INSENSITIVEを、並行処理タイプと合わせてこのメソッドに渡します。

// Statementオブジェクトの作成
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);

サンプルコード

以下の例では、双方向ResultSetの作成方法を示します。datasetテーブルからデータを取得する双方向のResultSetオブジェクトを作成し、previous()メソッドを使って最終行から先頭行に向かってデータを表示しています。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class BidirectionalResultSet {
    public static void main(String args[]) throws Exception {
        // ドライバの登録
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        // 接続の確立
        String mysqlUrl = "jdbc:mysql://localhost/TestDB";
        Connection con = DriverManager.getConnection(mysqlUrl, "root", "password");
        System.out.println("Connection established......");
        // 双方向スクロール可能なStatementオブジェクトの作成
        Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
        ResultSet.CONCUR_UPDATABLE);
        // データの取得
        ResultSet rs = stmt.executeQuery("select * from Dataset");
        // カーソルを最終行の後に移動
        rs.afterLast();
        System.out.println("Contents of the table");
        while(rs.previous()) {
            System.out.print("Brand: "+rs.getString("Mobile_Brand")+", ");
            System.out.print("Sale: "+rs.getString("Unit_Sale"));
            System.out.println("");
        }
    }
}

実行結果

Connection established......
Contents of the table
Brand: Vivo, Sale: 1500
Brand: Nokia, Sale: 5000
Brand: Samsung, Sale: 4000
Brand: IPhone, Sale: 3000

まとめ:2種類のResultSetの比較

種類カーソルの移動方向主なメソッド指定方法
前方専用(Forward Only)前方のみnext()デフォルト(TYPE_FORWARD_ONLY)
双方向(Bidirectional)前後両方向next()、previous()、absolute()などTYPE_SCROLL_SENSITIVE / TYPE_SCROLL_INSENSITIVE

単純にデータを先頭から順に読み取るだけであればデフォルトの前方専用ResultSetで十分ですが、後方へのスクロールや任意の行への移動が必要なケースでは、双方向ResultSetを活用しましょう。

  1. セキュリティ脆弱性は年間1万8千件超、実際に悪用されるのは約2%――CVEの実態とCVSS評価の仕組み

    毎年、セキュリティ企業やテック企業は数千件に及ぶ脆弱性の詳細を公表しています。メディアもそれらの脆弱性を取り上げ、特に危険度の高い問題を強調しながら、ユーザーへの安全対策を伝えています。 しかし、こう考えてみてください。公表される何千もの脆弱性のうち、実際にインターネット上で悪用されているものはごくわずかだということを。 では、セキュリティ脆弱性は全部でいくつあるのでしょうか。そして、セキュリティ企業は脆弱性の危険度をどのように判断しているのでしょうか。 セキュリティ脆弱性は全部でいくつある? Kenna Security(現Cisco)の「Prioritization to Predicti

  2. 許容できるオンライン広告とは?ユーザーが受け入れられる広告の条件を考察

    オンライン広告を目にすると、誰しもため息をつきたくなるものです。できれば広告なしで済ませたいと考えるのが自然でしょう。しかし、ウェブサイトや組織にとっては、サイト運営費を賄うために何らかの形で収益を得る必要があり、広告は不可欠な存在でもあります。では、どのようなオンライン広告なら許容できるのでしょうか。 私たちを取り巻く「広告だらけ」の現状 お気に入りのウェブサイトを訪れると、そこには大量の広告が表示されています。サイドバーに設置されているものもあれば、読んでいる本文中に紛れ込んでいるものもあるでしょう。さらに、Googleで情報を検索すれば検索結果に広告が混ざり込み、いずれかの結果をクリ