- - PR -
PreparedStatementでの注意点
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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を使う際、気をつけることなどがあればお教えください | ||||
|
投稿日時: 2004-07-13 10:53
すべてのJDBCドライバで,そのように振る舞うとは思えません。
PreparedStatementはドライバの実装によって,使用方法が微妙に異なったりすることがあります。 特にCHAR型データの場合,カラムのサイズにあわせて空白を補完した状態でPreparedStatementにバインドしないと,正しく機能されないかもしれませんし・・・。 昔Oracle8iを使っていたとき,PreparedStatement#setString()ではなく,JDBCドライバ依存のAPIを直接呼出さないといけないという制限もありました。 でも,パフォーマンスやセキュリティ面では,基底であるStatementをはるかに凌ぎます。 _________________ Kan Ogawa k-ogawa@users.sourceforge.jp | ||||
|
投稿日時: 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を使ってて「あれっ」いう経験があるのは 自分だけなのかな? | ||||
|
投稿日時: 2004-07-15 14:00
どのようなデータをバインドしたか、などは P6spy をつかえばわかりますよ。アプリケーションにインパクトを与えずデバッグできるので便利です。
http://www.p6spy.com/ | ||||
|
投稿日時: 2004-07-15 14:33
OracleのJDBC Thinドライバを使った場合、setString でセットできる文字数に制限があるとか(しかも結構少なめ)
| ||||
|
投稿日時: 2004-07-15 15:36
それは使っているJDBCドライバなりデータベースのバグなり制限事項なわけで、どっちを使っても同じ結果が返ってくるのが当然だと思います。 PreparedStatement(というinterface)自体の問題ではないのではないでしょうか? | ||||
1
