質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

38731閲覧

Mysql:SELECT文のWHERE句に変数を当てはめるには

manmos

総合スコア55

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2016/04/24 10:22

質問です。
タイトルの通りですがSELECT文のWHERE句に変数を当てはめるにはどうすれば良いでしょうか。
現在Mysqlの情報を一覧で表示し、そこからレコードの更新などを行うWEBアプリを作成中なんですが、この更新の際に一度レコードの情報を抽出して入力フォームの初期値にしたいと思ってます。
レコードを抽出するときは一覧に表示している主キーの番号を使おうとしているのですが、これをsql文に当てはめる方法がわかりません・・・
以下がsql文を行おうとしているメソッドになります。

public DetailInfo findDetail(String eId) { DetailInfo detailinfo = null; 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(); if (rs.next()) { // ユーザー情報を取得 DetailInfo Deflist = new DetailInfo(); Deflist.setEmployeeId(rs.getString("e_id")); Deflist.setName(rs.getString("name")); Deflist.setNameHiragana(rs.getString("name_hurigana")); Deflist.setCompany_id(rs.getString("birthday")); } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { } finally { if (rs != null) { try { rs.close(); } catch (SQLException e) { } rs = null; } if (pstmt != null) { try { pstmt.close(); } catch (SQLException e) { } pstmt = null; } if (conn != null) { try { conn.close(); } catch (SQLException e) { } conn = null; } } return detailinfo; }

デバックを行ってみるとeIdに必要な値は入っているのでそれをsql文に入れられるかどうかだと思います。
Insert文の場合とかだとValuesを使って?に値を入れることができたのですがWhere句の場合はどうすれば良いでしょうか。
詳しい方いらっしゃればご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Insert文の場合とかだとValuesを使って?に値を入れることができたのですがWhere句の場合はどうすれば良いでしょうか。

INSERT文と同じ要領で実現できます。

ご提示のソースコードを、以下のように修正してみてください。

Before

java

1String sql = "select * from e_info where e_id = eId"; 2// DB接続終了 3try { 4 Class.forName("com.mysql.jdbc.Driver"); 5 6 conn = DriverManager.getConnection(url, user, password); 7 pstmt = conn.prepareStatement(sql); 8 rs = pstmt.executeQuery();
After

java

1String sql = "select * from e_info where e_id = ?"; 2// DB接続終了 3try { 4 // JDK1.6 以降では不要 5 // Class.forName("com.mysql.jdbc.Driver"); 6 7 conn = DriverManager.getConnection(url, user, password); 8 pstmt = conn.prepareStatement(sql); 9 pstmt.setString(1, eId); 10 rs = pstmt.executeQuery();

swordone様の回答のように、プレースホルダ(?のこと)を使用しなくても実現できますが、
SQLインジェクション防止などの理由から、原則、プレースホルダを使用することをお勧めします。
https://ja.wikipedia.org/wiki/SQLインジェクション

ちなみに、JDK1.6以降では

java

1Class.forName("com.mysql.jdbc.Driver");

の一文は不要です。
https://docs.oracle.com/javase/jp/6/api/java/sql/DriverManager.html

アプリケーションでは、Class.forName() を使用して JDBC ドライバを明示的にロードする必要がなくなりました。

投稿2016/04/24 13:23

編集2016/04/24 13:27
KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

変数なら「””」内で変数展開されるんじゃないですか?

結合演算子使うとか…。

投稿2016/04/24 11:38

KatsukiSugiura

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/04/24 12:30

> 変数なら「””」内で変数展開されるんじゃないですか? Javaに変数展開はありませんよ。
KatsukiSugiura

2016/04/24 12:48

すいません、PHPだと思いました。 以後気をつけます。
guest

0

ベストアンサー

java

1String sql = "select * from e_info where e_id = " + eId;

これでいいのでは?

要はSQL文はただの文字列なのですから、要件を満たすような文字列を作ればいいわけです。

投稿2016/04/24 11:18

編集2016/04/24 11:19
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/04/24 13:19

変数eIdの値しだいですが、 SQL文に文字列リテラルを含める場合、 " または ' で囲ってやる必要がありますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問