java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

PreparedStatementのプレースホルダに値を設定する

投稿日:

最終更新日:2016年09月28日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

今回はPreparedStatementクラスを使い、プレースホルダを含むSQL文に値を設定して発行するということを行いました。

使うデータベースはH2DataBaseです。ブラウザ操作で必要なテーブルとデータの作成を行いました。

データベース側の準備

以下のCREATE文でSAMPLE_USERを作成しました。前回使ったテーブル名なので一度DROP文を使ってテーブルを削除しています。「DROP TABLE IF EXISTS SAMPLE_USER;」でSAMPLE_USERテーブルが存在する場合、削除するということができます。

CREATE文

CREATE TABLE SAMPLE_USER (
  ID CHAR(10) not null primary key,
  NAME VARCHAR(255) not null,
  AGE INT not null,
  YEAR INT not null
);

テーブルのカラムは以下の構成です。前回とほとんど同じです。最後にyearカラムを追加しています。

カラム名 not null制約 primary key
ID CHAR(10) あり
NAME VARCHAR(255) あり
AGE INT あり

レコードは社員を表し、最後のカラムに勤務年数を保持しているという想定です。今回はAGEとYEARの条件を指定して検索するということをやっていきます。

テーブルのデータは以下のSQL文で追加しました。

INSERT文

INSERT INTO SAMPLE_USER (ID, NAME, AGE, YEAR) VALUES('A000000001', 'サンプル名前1', 20, 1);
INSERT INTO SAMPLE_USER (ID, NAME, AGE, YEAR) VALUES('A000000002', 'サンプル名前2', 21, 2);
INSERT INTO SAMPLE_USER (ID, NAME, AGE, YEAR) VALUES('A000000003', 'サンプル名前3', 20, 1);
INSERT INTO SAMPLE_USER (ID, NAME, AGE, YEAR) VALUES('A000000004', 'サンプル名前4', 21, 2);

検索処理の実装

以下、作ったプログラムです。

ソース

    private static final String sql = "SELECT * FROM SAMPLE_USER WHERE AGE = ? AND YEAR = ?";

    public static void main(String[] args) {

        try (Connection connection = DriverManager.getConnection("jdbc:h2:~/test", "sa", "");
                PreparedStatement ps = connection.prepareStatement(sql)) {

            ps.setString(1, "20");
            ps.setString(2, "1");

            try (ResultSet rs = ps.executeQuery()) {
                while (rs.next()) {
                    System.out.println(rs.getString("id") + ","
                            + rs.getString("name") + ","
                            + rs.getString("age") + ","
                            + rs.getString("year"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

staticである変数sqlにSQL文の雛形を定義しました。今回は検索条件を指定するので、WHERE句を使っています。値になる部分にプレースホルダ「?」を記述しています。

mainメソッドの処理の流れは前回とほとんど同じです。プレースホルダに値を設定する箇所以外はほぼ同じです。

PreparedStatement#setStringでSQL文の「?」に文字列を設定することができます。第一引数には「?」の位置を表す自然数を指定します。つまり、最初に現れる「?」を指定する場合、1です。上記プログラムではageが20でyearが1という条件を設定したことになります。

以下が実行結果です。

結果

A000000001,サンプル名前1,20,1
A000000003,サンプル名前3,20,1

検索条件で抽出されていることが確認できます。