回答編集履歴

1 誤記を修正

KiyoshiMotoki

KiyoshiMotoki score 4699

2016/04/24 22:27  投稿

> Insert文の場合とかだとValuesを使って?に値を入れることができたのですがWhere句の場合はどうすれば良いでしょうか。
INSERT文と同じ要領で実現できます。
ご提示のソースコードを、以下のように修正してみてください。
##### Before
```java
String sql = "select * from e_info where e_id = eId";
// DB接続終了
try {
   Class.forName("com.mysql.jdbc.Driver");
   conn = DriverManager.getConnection(url, user, password);
   pstmt = conn.prepareStatement(sql);
   rs = pstmt.executeQuery();
```
##### After
```java
String sql = "select * from e_info where e_id = ?";
// DB接続終了
try {
   // JDK1.6 以降では不要
   // Class.forName("com.mysql.jdbc.Driver");
   conn = DriverManager.getConnection(url, user, password);
   pstmt = conn.prepareStatement(sql);
   pstmt.setString(1, eId);
   rs = pstmt.executeQuery();
```
swordone様の回答のように、プレースホルダ(`?`のこと)を使用しなくても実現できますが、
SQLインジェクション防止などの理由から、原則、プレースホルダを使用することをお勧めします。
[https://ja.wikipedia.org/wiki/SQLインジェクション](https://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)
ちなみに、JDK1.6以降では
```java
Class.forName("com.mysql.jdbc.Driver");
```
の一文は不要です。
[https://docs.oracle.com/javase/jp/6/api/index.html?java/sql/PreparedStatement.html](https://docs.oracle.com/javase/jp/6/api/index.html?java/sql/PreparedStatement.html)
[https://docs.oracle.com/javase/jp/6/api/java/sql/DriverManager.html](https://docs.oracle.com/javase/jp/6/api/java/sql/DriverManager.html)
> アプリケーションでは、Class.forName() を使用して JDBC ドライバを明示的にロードする必要がなくなりました。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る