JavaからMySQLを操作する:WHERE句の条件値にPreparedStatementを正しく使う方法
JavaからMySQLデータベースに対して、WHERE句の条件に変数の値を渡してクエリを実行したい場合、PreparedStatementを使用するのが最も安全かつ確実な方法です。SQLインジェクション対策にもなり、パフォーマンス面でもメリットがあります。
基本的な構文は以下の通りです。
String anyVariableName = "select yourColumnName from yourTableName where name = ?"; PreparedStatement ps = (PreparedStatement) con.prepareStatement(yourVariableName); ps.setString(yourColumnIndex, yourValue);
ポイントは、SQL文の中で条件値を直接書かずに「?」(プレースホルダ)を記述し、後からsetString()メソッドで実際の値をバインドすることです。
検証用テーブルの作成
まず、動作確認のためのテーブルを作成しましょう。
mysql> create table demo37 -> ( -> id int not null auto_increment primary key, -> name varchar(200) -> ); Query OK, 0 rows affected (2.46 sec)
次に、INSERTコマンドを使ってテーブルにレコードを挿入します。
mysql> insert into demo37(name) values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo37(name) values('Bob');
Query OK, 1 row affected (0.08 sec)
mysql> insert into demo37(name) values('John');
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo37(name) values('Chris');
Query OK, 1 row affected (0.08 sec)
mysql> insert into demo37(name) values('David');
Query OK, 1 row affected (0.12 sec)
mysql> insert into demo37(name) values('John');
Query OK, 1 row affected (0.13 sec)
mysql> insert into demo37(name) values('Mike');
Query OK, 1 row affected (0.09 sec)SELECT文でテーブル内のレコードを表示してみます。
mysql> select *from demo37;
実行すると、次のような結果が得られます。
+----+-------+ | id | name | +----+-------+ | 1 | John | | 2 | Bob | | 3 | John | | 4 | Chris | | 5 | David | | 6 | John | | 7 | Mike | +----+-------+ 7 rows in set (0.00 sec)
JavaでのPreparedStatement実装例
ここでは、「name」カラムが「John」と一致するレコードだけを抽出するJavaプログラムを紹介します。プレースホルダ「?」にsetString(1, "John")で値を設定している点に注目してください。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class PrepareStatementDemo {
public static void main(String[] args) {
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/sampledatabase", "root", "123456");
String query = "select name from demo37 where name = ?";
PreparedStatement ps = (PreparedStatement) con.prepareStatement(query);
ps.setString(1, "John");
ResultSet rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getString(1));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}実行結果
このプログラムを実行すると、nameが「John」である3件のレコードが出力されます。
John John John
このように、PreparedStatementを使えば、WHERE句の条件値を安全に動的に設定できます。文字列連結でSQLを組み立てる方法と違い、特殊文字のエスケープ処理も自動的に行われるため、実務では必ずPreparedStatementの利用を推奨します。
-
JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法
executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手
-
JavaとMySQLでLIKE検索を使う際、検索変数の引用符を正しく記述する方法
JavaからMySQLに接続し、LIKE句で検索変数(キーワード)を使ったあいまい検索を行う場合、SQL文中の文字列を正しくシングルクォート()で囲むことが重要です。まず、検索変数を使ったLIKE句の正しい構文を見てみましょう。String sqlQuery; sqlQuery = select * from yourTableName where yourColumnName like % + yourSearchVariableName + %;それでは、実際にサンプルテーブルを作成して動作を確認していきます。サンプルテーブルの作成まず、テーブルを作成します。mysql> creat