- - PR -
setStringメソッドが機能しない
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2008-11-12 12:54
こんにちは。
MySQL5.0を使いJavaの勉強をしています。以下のソースコードを書き、コンパイルも通り実行もできました。 ○MySQLTest.java import java.sql.*; class MySQLTest{ private Connection conn; private PreparedStatement ps; private String str_sql; public MySQLTest()throws Exception{ Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/S_DB?user=root&password=john1009"); } public void createSELECT(String str)throws Exception{ str_sql = "SELECT * FROM emp WHERE name = ?"; PreparedStatement ps = conn.prepareStatement(str_sql); ps.setString(1,str); } public static void main(String[]args)throws SQLException{ try{ MySQLTest mt = new MySQLTest(); mt.createSELECT(args[0]); System.out.println(mt.str_sql); }catch(Exception e){ e.printStackTrace(); } } } やりたいことはPreparedStatementを使い、用意したSQL文の?の部分にsetStringメソッドを使って文字列を組み込みそれを出力するというものです。 しかし上記のps.setString(1,str);を実行しているにも関わらず出力されるstr_sqlが元の状態のままでうまく組み込めません。 実行例) >java MySQLTest John SELECT * FROM emp WHERE name = ? となってしまいます。 どなたかご教授いただけないでしょうか。 よろしくお願いいたします。 JDK:1.6.0_07 OS:Windows Vista |
|
投稿日時: 2008-11-12 13:32
ps.setString(1,str);
は実際の文字列SQLに埋め込むわけではありませんので str_sqlを出力しても?部分は?のままです。 ざっとしか見てませんが このままでもSQLが正しければ問合せの結果は正しく返るはずですよ。 |
|
投稿日時: 2008-11-12 13:32
PreparedStatement に setString()した場合に、
元のSQL文字列(この場合は、str_sql)が違う物に置き換わるような事はありません。 |
|
投稿日時: 2008-11-12 13:34
PreparedStatementはSQLを編集する目的のものではありません。
プレースホルダを含むSQLをDBサーバ側で事前にコンパイルし、 値だけ別で渡して実行する仕組みです。 また、str_sql = "SELECT * FROM emp WHERE name = ?"; と設定した結果を出力しているだけなので、その通りにしか出ませんよ。 フィールドのSQL文字列は変化しません。 仮にPreparedStatementにSQL編集機能があったところで、 Javaには参照渡しというのがありませんし、 文字列は不変オブジェクトなので、変える事はできません。 |
|
投稿日時: 2008-11-12 14:12
ジン様、やんち様、かつのり様
早速のご回答ありがとうございます。 String値の?の部分が変わるわけではないのですね。勉強になりました。 ためしにデータを取り出してみたところ正常に取り出せました。初歩的な質問で申し訳ありません。 実は今PreparedStatementを使いINSERT文でデータを入力するアプリケーションを作っていて(「INSERT INTO emp(name,age,gender,address,tel,email)VALUES(?,?,?,?,?,?)」で?の部分にfor文でデータを入れていく)、データの入力の時にエラーが起きています。それが?の部分が変わっていないのが原因なのかと思い簡単なサンプルコードを作った次第です。 エラーの原因は他にあることがわかりました。いろいろ調べていきたいと思います。 ご回答どうもありがとうございました。 |
1