2

一部のJava既存コードを変更しようとしていますが(私は実行していません)、prepareステートメントを使用してクエリが実行されていないことがわかりました。私はたくさんのコードを持っているので、できるだけ修正しようとはしていません。したがって、次のような方法を使用する代わりに

public void executeInsertStmt(String strQuery, String param1, String param2) {

...
...
PreparedStatement preparedStatement = cnx.prepareStatement(stringRequest);
preparedStatement.setString(1, param1);
preparedStatement.setString(2, param2);
}

私はそのようなことをしたいと思います(それが最善の解決策かどうかはわかりません)。

public void executeInsertStmt(String strQuery, ArrayList<ArrayList<Object>> parameters) {

PreparedStatement preparedStatement = cnx.prepareStatement(stringRequest);

int counter=1;
            for (final ArrayList<Object> eachParam : parameters) {

                switch(DataTypes.valueOf(eachParam.get(0).toString().toUpperCase()))
                {
                    case STRING:
                        preparedStatement.setString(counter, (String)eachParam.get(1));
                    break;
                    case DATE:
                        preparedStatement.setDate(counter, (Date)eachParam.get(1));
                    break;
                    case INT:
                        preparedStatement.setInt(counter, (Integer)eachParam.get(1));
                    break;
                    default:
                        preparedStatement.setString(counter, (String)eachParam.get(1));
                    break;
                }

                counter++;

            }
}

そして、このようなものを持つために:

strQuery = "insert into toto values (?,?)";
ArrayList<Object> paramToPass1 = new ArrayList<Object>();

paramToPass1.add("String");
paramToPass1.add("TheValueForTheString");

ArrayList<Object> paramToPass2 = new ArrayList<Object>();

paramToPass2.add("String");
paramToPass2.add("TheValueForTheString2");

ArrayList<ArrayList<Object>> paramToPass = new ArrayList<ArrayList<Object>>();

paramToPass.add(paramToPass1);
paramToPass.add(paramToPass2);


executeInsertStmt(strQuery,paramToPass);

パラメータの数が異なるクエリがたくさんあるので、この種のアプローチが最適です。クエリの種類ごとにメソッドを実行する必要はありません。

どう思いますか。

それについて何か問題がありますか?行くための最良の方法はありますか?

アイデアをありがとう。

4

2 に答える 2

0

まあ、あなたの考えは悪くありません...いくつかの指針です。

ArrayList の ArrayList を渡すのではなく、instanceof または DataHolder クラスを使用してください。

方法 1: インスタンス

Integer、String、Double などの単純な型を追加してから、メソッドに次のように入力します。

public void executeInsertStmt(String strQuery, ArrayList<Object> parameters) {

    PreparedStatement preparedStatement = cnx.prepareStatement(stringRequest);
    int counter=1;
    for (final Object eachParam : parameters) {
        if (eachParam instanceof String) {
            preparedStatement.setString(counter, (String)eachParam); 
        } else if (eachParam instanceof Integer) {
            preparedStatement.setInt(counter, (Integer)eachParam); 
        } else ...

        counter++;

    }
}

DataHolder の考え方は、1 つのフィールドが型を保持し、もう 1 つのフィールドが実際のデータを保持するというものです。ジェネリックを使用して、さらに優れたものにすることもできます。ただし、この場合は instanceof を使用します。

于 2012-04-12T14:18:25.213 に答える