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

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の利用を推奨します。

  1. JavaでMySQLのSELECTクエリにPreparedStatement(プリペアドステートメント)を使う方法

    executeQuery()メソッドの基本的な使い方JavaからMySQLに対してSELECTクエリを実行する場合は、PreparedStatementオブジェクトのexecuteQuery()メソッドを使用します。基本構文は以下の通りです。yourPreparedStatementObject = yourConnectionObject.prepareStatement(yourQueryName);yourResultSetObject = yourPreparedStatementObject.executeQuery();それでは、実際にサンプルデータベース「sample」を使って手

  2. JavaとMySQLでLIKE検索を使う際、検索変数の引用符を正しく記述する方法

    JavaからMySQLに接続し、LIKE句で検索変数(キーワード)を使ったあいまい検索を行う場合、SQL文中の文字列を正しくシングルクォート()で囲むことが重要です。まず、検索変数を使ったLIKE句の正しい構文を見てみましょう。String sqlQuery; sqlQuery = select * from yourTableName where yourColumnName like % + yourSearchVariableName + %;それでは、実際にサンプルテーブルを作成して動作を確認していきます。サンプルテーブルの作成まず、テーブルを作成します。mysql> creat