54

私はJavaのPreparedStatmentオブジェクトを使用して、一連のバッチ化されたINSERTクエリを作成しています。クエリステートメントの形式は...

String strQuery = "INSERT INTO ? (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";

...したがって、フィールド値とテーブル名はどちらも変数です(つまり、同じ列形式の複数のテーブルがあり、各挿入は異なるテーブルに送信されます)。「?」を削除すると、実行を機能させることができます。tablename変数とハードコードですが、準備された各ステートメントは異なるテーブルに挿入されるため、次を使用してバッチクエリを実行する直前に入力する変数のままにする必要があります...

stmt.setString(1, "tableName1");

これを動的変数にするにはどうすればよいですか?

4

4 に答える 4

81

できません。文字列連結/プレースホルダーを使用してSQLをString.formatで構成する必要があります。プリペアドステートメントは、テーブル名ではなく列値用です。

于 2012-07-03T13:43:03.987 に答える
5

テーブル名の代わりにプレースホルダーを使用し、それをテーブル名に置き換えることができます。

String strQuery = "INSERT INTO $tableName (col1, col2, col3, col4, col5)
                   VALUES (?,?,?,?,?,?);";

テーブル名がわかったら置き換えます

String query =strQuery.replace("$tableName",tableName);
stmt =conn.prepareStatement(query);
于 2013-01-10T13:00:22.043 に答える
-1

1つの選択肢はString.format次のとおりです。

例えば

String sql = String.format("INSERT INTO $1%s (col1, col2, col3, (etc)",  myTablename);
于 2012-07-03T15:43:43.913 に答える
-5

テーブル名が独自のコードに由来する場合のみ...

...元の文字列に追加する必要があります。

String tableName = "some_table_name";
// some other code
String strQuery = "INSERT INTO " + tableName + " (col1, col2, col3, col4, col5) VALUES (?,?,?,?,?,?);";

テーブル名が他の信頼できないソース (ユーザー入力、他のコードが渡すパラメーター) から来ている場合はこれを行わずに他の回答を参照してください。

于 2012-07-03T13:42:02.690 に答える