パラメータークエリ

データベースからデータを利用するとき、いつも同じSQL文を使えるわけではありません。状況によってユーザーが検索キーワードを入力し、それをもとにデータを抽出することもあります。その際、抽出するための条件をそのたびに設定しなくてはなりません。今までは次のようにSQL文に直接条件を指定しました。

String sql = "SELECT * FROM users WHERE id=" + idData;
(変数idDataにユーザーが指定したIDが入っているとする)

そのほかにも条件を指定する方法があります。それがパラメータークエリです。パラメータークエリを利用するにはSQL文の条件の部分で、「?」を割り当てておきます。

後で「?」に値を設定することにより、その時に応じたデータを抽出することができます。パラメーターを指定するにはPreparedStatementオブジェクトを使用します。このオブジェクトのメソッドを使ってパラメーターにデータをセットします。このオブジェクトはConnectionオブジェクトのprepareStatementメソッドで取得できます。

■ 主なメソッド

メソッド名 概要
clearParameters このオブジェクトのパラメーターをクリアする
executeQuery SELECT文の実行結果を表すResultSetオブジェクトを返す
executeUpdate INSERT、UPDATE、DELETE文を実行する
setDouble 指定されたパラメーターにdouble値を設定する
setInt 指定されたパラメーターにint値を設定する
setNull 指定されたパラメーターにNULL値を設定する
setString 指定されたパラメーターにString値を設定する
PreparedStatementの主なメソッド

○ ファイル

先回作成したStatementTest.javaのプログラムをパラメータークエリに変更してみましょう。StatementTest.javaファイルをコピーして、次のファイルを作成してください。

ファイル名 ParameterTest.java

サンプルダウンロード

○ プログラム

次のようにプログラムを入力してください。

ParameterTest.java

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.sql.Connection;
  4. import java.sql.DriverManager;
  5. import java.sql.PreparedStatement;
  6. public class ParameterTest{
  7.     public static void main(String[] args){
  8.         try{
  9.             //JDBCドライバークラスを指定する
  10.             String drivername = "com.mysql.cj.jdbc.Driver";
  11.             //データベースを指定する
  12.             String url = "jdbc:mysql://localhost:3306/books? characterEncoding=utf8";
  13.             //ユーザー名を指定する
  14.             String username = "root";
  15.             //パスワードを指定する
  16.             String password = "";
  17.             //指定したドライバークラスを読み込む
  18.             Class.forName(drivername);
  19.             //データベースに接続する
  20.             Connection con = DriverManager.getConnection(url, username, password);
  21.             //追加する情報を入力する
  22.             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  23.             System.out.println("登録するユーザー情報を入力してください。");
  24.             System.out.print("ID:");
  25.             int id = Integer.parseInt(br.readLine());
  26.             System.out.print("ユーザー名:");
  27.             String uname = br.readLine();
  28.             System.out.print("パスワード:");
  29.             String passwd = br.readLine();
  30.             System.out.print("氏名:");
  31.             String name = br.readLine();
  32.             //入力した情報をもとにSQL文を作成する
  33.             String sql = "INSERT INTO users VALUES(?, ?, ?, ?)";
  34.             //PreparedStatementオブジェクトを取得する
  35.             PreparedStatement pst = con.prepareStatement(sql);
  36.             //パラメーターを追加する
  37.             pst.setInt(1, id);
  38.             pst.setString(2, uname);
  39.             pst.setString(3, passwd);
  40.             pst.setString(4, name);
  41.             //SQL文を実行する
  42.             int ret = pst.executeUpdate();
  43.             
  44.             //変更のあった行数を表示する
  45.             System.out.println("変更のあった件数:" + ret);
  46.             //データベースを切断する
  47.             pst.close();
  48.             con.close();
  49.         }catch(Exception e){
  50.             //例外の状態を出力する
  51.             e.printStackTrace();
  52.         }
  53.     }
  54. }

○ コンパイルと実行

C:¥work>javac ParameterTest.java
C:¥work>java -cp mysql-connector-java-8.0.22.jar;. ParameterTest
登録するユーザー情報を入力してください。
ID:6
ユーザー名:yamamoto
パスワード:ypass
氏名:山本
変更のあった件数:1

C:¥work>

usersテーブルに追加されている
usersテーブルに追加されている

○ 解説

41行目でパラメータークエリを作成しています。ID、ユーザー名、パスワード、氏名用のパラメーターを設定しています。それぞれのパラメーターに対して47~50行目でデータを設定しています。列のデータ型に応じてsetXXメソッドを指定し、引数に順番、データを渡します。パラメーターにデータを設定した後、53行目でSQL文を実行しています。

パラメーター化したSQL文を指定する場合、パラメーター全てにデータをセットしないとSQL文を実行できません。また、文字列で連結してSQL文を作成する方法と違い、SQLインジェクションの防止となります。

前へ   次へ