- PR -

PreparedStatementでの注意点

1
投稿者投稿内容
Tom
常連さん
会議室デビュー日: 2004/06/07
投稿数: 23
お住まい・勤務地: 東京都
投稿日時: 2004-07-13 10:20
どちらかというとSQL関連の話なのですが質問させていただきます。

最近、よくDBとJavaとの関連でPreparedStatementを使うことを推奨されますが
昔、ひとつはまったことがあります。
というのはPreparedStatementを使ったものと平のSQL文が等しくなかったことです。
例えばCOL1がCHARでDEFAULTが空白で10文字まで入るとした時、
使わない場合
SELECT * FROM TABLE1 WHERE COL1='test' → 該当あり
使った場合
SELECT * FROM TABLE1 WHERE COL1=?
pstmt.setString("test") → 該当無し
でも
pstmt.setString("test ")空白を入れる → 該当有り

それ以来、自分はPreparedStatemnetを使うのに抵抗がでてしまいました。

で質問なのですが
他にPreparedStatementを使う際、気をつけることなどがあればお教えください
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2004-07-13 10:53
すべてのJDBCドライバで,そのように振る舞うとは思えません。
PreparedStatementはドライバの実装によって,使用方法が微妙に異なったりすることがあります。

特にCHAR型データの場合,カラムのサイズにあわせて空白を補完した状態でPreparedStatementにバインドしないと,正しく機能されないかもしれませんし・・・。
昔Oracle8iを使っていたとき,PreparedStatement#setString()ではなく,JDBCドライバ依存のAPIを直接呼出さないといけないという制限もありました。

でも,パフォーマンスやセキュリティ面では,基底であるStatementをはるかに凌ぎます。

_________________
Kan Ogawa
k-ogawa@users.sourceforge.jp
Tom
常連さん
会議室デビュー日: 2004/06/07
投稿数: 23
お住まい・勤務地: 東京都
投稿日時: 2004-07-15 13:55
SuperCreekさん、ご返答ありがとうございます。

確かに全てのJDBCでそう振舞うとは限りませんね。

ただStatementだと通るのにPreparedStatementだと通らないとか
この環境だと大丈夫だがあの環境だと駄目とかだと
デバッグが難しくなるのが困ってしまう気がします。
結果が必ず返ってくるとは限らないSQLで
自分が通ると思い込んでいたSQLがとおっていない場合など特に。
DBにStatementで使うようなSQLをさくっと投げてテストできなくなるので。

あと、INSERT文はともかくUPDATE文などカラム数が多い場合
?がたくさん並びどこに何を格納したのかログだけでは
分かりづらくなる気がします。
例えばログを出すのにひねらないコーディングをしたら
[SQL]
UPDATE TABLE1 SET COL1=?,COL2=?,・・・
[値]
1."値1";
2."値2";
・・・

まぁ、これに関しては自分てきにはソースのほうでは対応していますが
例えば
sql.append("col1=?, "); arrayList.add( col1 );
sql.append("col2=?, "); arrayList.add( col2 );
・・・
みたいな感じで・・・
でもコーディングルールで引っかかりそうです・・・
(まぁログの出しかたを上記のソース風に変えればいいかもしれませんが・・・)
他にいい方法があったらお教えください。

ちなみにPreparedStatementを使ってて「あれっ」いう経験があるのは
自分だけなのかな?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-07-15 14:00
どのようなデータをバインドしたか、などは P6spy をつかえばわかりますよ。アプリケーションにインパクトを与えずデバッグできるので便利です。
http://www.p6spy.com/
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2004-07-15 14:33
OracleのJDBC Thinドライバを使った場合、setString でセットできる文字数に制限があるとか(しかも結構少なめ)
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-07-15 15:36
引用:

Tomさんの書き込み (2004-07-13 10:20) より:
それ以来、自分はPreparedStatemnetを使うのに抵抗がでてしまいました。



それは使っているJDBCドライバなりデータベースのバグなり制限事項なわけで、どっちを使っても同じ結果が返ってくるのが当然だと思います。

PreparedStatement(というinterface)自体の問題ではないのではないでしょうか?
1

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