パラメータークエリ
データベースからデータを利用するとき、いつも同じ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値を設定する |
○ ファイル
先回作成したStatementTest.javaのプログラムをパラメータークエリに変更してみましょう。StatementTest.javaファイルをコピーして、次のファイルを作成してください。
ファイル名 | ParameterTest.java |
---|
○ プログラム
次のようにプログラムを入力してください。
ParameterTest.java
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.PreparedStatement;
- public class ParameterTest{
- public static void main(String[] args){
- try{
- //JDBCドライバークラスを指定する
- String drivername = "com.mysql.cj.jdbc.Driver";
- //データベースを指定する
- String url = "jdbc:mysql://localhost:3306/books? characterEncoding=utf8";
- //ユーザー名を指定する
- String username = "root";
- //パスワードを指定する
- String password = "";
- //指定したドライバークラスを読み込む
- Class.forName(drivername);
- //データベースに接続する
- Connection con = DriverManager.getConnection(url, username, password);
- //追加する情報を入力する
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- System.out.println("登録するユーザー情報を入力してください。");
- System.out.print("ID:");
- int id = Integer.parseInt(br.readLine());
- System.out.print("ユーザー名:");
- String uname = br.readLine();
- System.out.print("パスワード:");
- String passwd = br.readLine();
- System.out.print("氏名:");
- String name = br.readLine();
- //入力した情報をもとにSQL文を作成する
- String sql = "INSERT INTO users VALUES(?, ?, ?, ?)";
- //PreparedStatementオブジェクトを取得する
- PreparedStatement pst = con.prepareStatement(sql);
- //パラメーターを追加する
- pst.setInt(1, id);
- pst.setString(2, uname);
- pst.setString(3, passwd);
- pst.setString(4, name);
- //SQL文を実行する
- int ret = pst.executeUpdate();
- //変更のあった行数を表示する
- System.out.println("変更のあった件数:" + ret);
- //データベースを切断する
- pst.close();
- con.close();
- }catch(Exception e){
- //例外の状態を出力する
- e.printStackTrace();
- }
- }
- }
○ コンパイルと実行
C:¥work>javac ParameterTest.java
C:¥work>java -cp mysql-connector-java-8.0.22.jar;. ParameterTest
登録するユーザー情報を入力してください。
ID:6
ユーザー名:yamamoto
パスワード:ypass
氏名:山本
変更のあった件数:1
C:¥work>
○ 解説
41行目でパラメータークエリを作成しています。ID、ユーザー名、パスワード、氏名用のパラメーターを設定しています。それぞれのパラメーターに対して47~50行目でデータを設定しています。列のデータ型に応じてsetXXメソッドを指定し、引数に順番、データを渡します。パラメーターにデータを設定した後、53行目でSQL文を実行しています。
パラメーター化したSQL文を指定する場合、パラメーター全てにデータをセットしないとSQL文を実行できません。また、文字列で連結してSQL文を作成する方法と違い、SQLインジェクションの防止となります。