2007年11月18日日曜日

PreparedStatement

 データベースへ接続して書き込みなどを行う際、SQL 命令文 「’」「”」などはエスケープ処理をする必要があります。
 例えば下記のようなエスケープメソッドを定義して利用することができます。

    public static String escape(String s) {    
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            switch (s.charAt(i)) {
                case '\'' :
                    str.append("\\\'");
                    break;
                case '"' :
                    str.append("\\\"");
                    break;
                case '\\' :
                    str.append("\\\\");
                    break;
                default :
                    str.append(s.charAt(i));
                    break;
            }
        }
        return str.toString();
    }
______

 しかし、PreparedStatement の setString メソッドを使うとセットする文字列を自動でエスケープしてくれるのでエスケープメソッドは必要なくなります。
 PreparedStatement には setString だけでなく setInt, setLong などのメソッドもあります。

PreparedStatement pst = con.prepareStatement("select*from mytable where title=?");
pst.setString(1, req.getParameter("title"));

 などのように利用するだけで req.getParameter("title") に SQL 命令文に影響を与える文字があってもエスケープしてくれます。
 
 また、ステートメントを用意した後は setString メソッドなどを使ってパラメータを変えるだけで次のSQL 文を作成できるので高速に動作します。

0 件のコメント: