public int update(String sql) { int ret = -1; try { ret = stmt.executeUpdate(sql); } catch(SQLException e) { e.printStackTrace(); } return ret; }
} -----
上記のように、結構汎用的に出来ていると思います。 使う時は ----- bean.Dao dao = new bean.Dao(); dao.connect(); ResultSet rs = dao.query("SELECT * FROM user WHERE uname = 'hoge' AND pass = 'piyo'"); while(rs.next()) { //省略 } dao.close(); ----- とか・・・
----- bean.Dao dao = new bean.Dao(); dao.connect(); int ret = dao.update("DELETE FROM user WHERE uid = 1"); dao.close(); ----- とか言う感じに、JSPもしくはServletからDaoのインスタンスを生成して使う事ができます。
しかしこの状態だと、SQLインジェクション攻撃を受けてしまいます。(検証済み) そこで何か良い対策はないかと調べてみたところ、PreparedStatementを使うと サニタイジングを内部で勝手にやってくれるらしく、ぜひこれを利用しようと考えました。 しかしココで問題が発生しました。 PreparedStatementをこのDaoに適用したいのですが、どういう風にコーディングすれば 汎用的に、様々なシステムに使いまわせるDaoになるのかが分からないのです。 上記の使い方みたいに、手軽にDBにconnect()した後 queryメソッドやらupdteメソッドで SQLを実行した後、close()で閉じると言うような使い勝手のDaoを作りたいと思っています。 しかしPreparedStatementは ? と言う文字で(プレースホルダと言う?) "SELECT * FROM user WHERE uname = ? pas = ?" みたいな文字列を与えないといけないし、 その後で setString(1, "hoge") setString(2, "piyo") と言ったコードを書かないといけません。 与えるSQL文が毎回色々違うわけなので、 ? の部分が何個必要になるか分からないし、 StringじゃなくてIntの引数(例えば会員番号を与えるとか)、あるいはDataの引数を与えるとか 1.引数の数が違う 2.与える引数の型が違う