0

MySQL テーブルを更新する関数が 1 つあります。パラメータが存在するかどうかに応じて、フィールドを選択的に更新する必要があります。これが私が今それをコーディングした方法です。

        String sql =  "";
        if (employerId > 0) sql = sql + "employerid=?,";
        if (status != null) sql += " status=?,";
        if(printurl != null) sql += " url=?";
        if (sql.endsWith(",")) sql = sql.substring(0, sql.length()-1);
        PreparedStatement ps = con.prepareStatement("update employer set "
                + sql
                + "where id=?");

       if (employerId > 0) ps.setInt(1, employerId);
       if (status != null) ps.setString(2,status);

このような場合、パラメーター インデックスはどのように決定すればよいですか? 存在するパラメーター (if 条件) に応じて、パラメーターのインデックスも異なりますよね? どうすればこれを回避できますか? Javaでこれを処理するより良い方法はありますか?

4

4 に答える 4

2

以下のように静的クエリを試していただけますか?

String sql =  "update employer set employerid=IF(?=0,employerid,?),"+
              "status=IFNULL(?,status), url=IFNULL(?,url) " +
              "where id=?";

概念的には、0またはである場合は、列をそれ自体で更新することをお勧めしますnull。このように、動的クエリ文字列を作成したり、パラメータを動的に設定したりする必要はありません。

于 2012-10-17T03:04:32.410 に答える
1

SqlBuilderライブラリは、Java プログラムで動的 SQL クエリを生成するためのはるかに優れた方法を提供しますQueryPreparerクラスは、インデックスを追跡することで、ここで発生している問題に具体的に対処します。

免責事項、私は SqlBuilder プロジェクトの主な開発者です。

于 2012-10-17T02:47:11.857 に答える
1

arraylistを使用するのはどうですか? パラメータが存在するかどうかを最初に確認するときは、arraylist に追加します。その後、配列リストと設定パラメータを繰り返します。この場合、

パラメーターのインデックスを特定するだけでなく、パラメーターが存在するかどうかを再確認することも回避します。

そのように

List paramList = new ArrayList<Object>();

         if (employerId > 0) {
             sql = sql + "employerid=? ,";
             paramList.add(employerId);
         }
         if (status != null) { 
             sql += " status=? ,";
             paramList.add(status);
         }
         if(printurl != null) {
             sql += " url=? ";
             paramList.add(printurl);
         }
         if (sql.endsWith(",")) 
             sql = sql.substring(0, sql.length()-1);

         PreparedStatement ps = con.prepareStatement("update employer set " + sql + "where id=?");

         for(int i=0; i< paramList.size(); i++) {
             if(paramList.get(i) instanceof Integer) {
                 ps.setInt((i + 1), (Integer)paramList.get(i));
             }
             else if(paramList.get(i) instanceof String) {
                 ps.setString((i + 1), (String)paramList.get(i));
             }
         }
         System.out.println(ps);
于 2012-10-17T03:11:43.483 に答える
0

次のコードを参照してください。

       String sql =  "update employer set ";
        boolean hasParam = false;
        if (employerId > 0){
                sql += " employerid=? ";
                hasParam = true;
        }
        if (status != null){
            if(hasParam){
                sql += " , ";
            }
            sql += " status=? ";
            hasParam = true;
        }
        if(printurl != null){
            if(hasParam){
                sql += " , ";
            }
            sql += " url=?";
        }
        sql += " where id=?";
        PreparedStatement ps = con.prepareStatement(sql);

       int index = 1;
       if(employerId > 0){
           ps.setInt(index++, employerId);
       }
       if(status != null){
           ps.setString(index++, status);
       }
       if(printurl != null){
           ps.setString(index++, printurl);
       }
       ps.setInt(index, id);
于 2012-10-17T02:50:51.173 に答える