- PR -

setStringメソッドが機能しない

1
投稿者投稿内容
Djerzinski
会議室デビュー日: 2008/10/22
投稿数: 4
投稿日時: 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
ジン
ベテラン
会議室デビュー日: 2007/07/27
投稿数: 52
投稿日時: 2008-11-12 13:32
ps.setString(1,str);

は実際の文字列SQLに埋め込むわけではありませんので
str_sqlを出力しても?部分は?のままです。

ざっとしか見てませんが
このままでもSQLが正しければ問合せの結果は正しく返るはずですよ。
やんち
常連さん
会議室デビュー日: 2008/10/24
投稿数: 32
投稿日時: 2008-11-12 13:32
PreparedStatement に setString()した場合に、
元のSQL文字列(この場合は、str_sql)が違う物に置き換わるような事はありません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-11-12 13:34
PreparedStatementはSQLを編集する目的のものではありません。
プレースホルダを含むSQLをDBサーバ側で事前にコンパイルし、
値だけ別で渡して実行する仕組みです。

また、str_sql = "SELECT * FROM emp WHERE name = ?";
と設定した結果を出力しているだけなので、その通りにしか出ませんよ。
フィールドのSQL文字列は変化しません。

仮にPreparedStatementにSQL編集機能があったところで、
Javaには参照渡しというのがありませんし、
文字列は不変オブジェクトなので、変える事はできません。
Djerzinski
会議室デビュー日: 2008/10/22
投稿数: 4
投稿日時: 2008-11-12 14:12
ジン様、やんち様、かつのり様
早速のご回答ありがとうございます。

String値の?の部分が変わるわけではないのですね。勉強になりました。

ためしにデータを取り出してみたところ正常に取り出せました。初歩的な質問で申し訳ありません。

実は今PreparedStatementを使いINSERT文でデータを入力するアプリケーションを作っていて(「INSERT INTO emp(name,age,gender,address,tel,email)VALUES(?,?,?,?,?,?)」で?の部分にfor文でデータを入れていく)、データの入力の時にエラーが起きています。それが?の部分が変わっていないのが原因なのかと思い簡単なサンプルコードを作った次第です。

エラーの原因は他にあることがわかりました。いろいろ調べていきたいと思います。

ご回答どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)