web-dev-qa-db-ja.com

Java準備済みステートメントの挿入にテーブル名変数を使用する方法

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

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

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

stmt.setString(1, "tableName1");

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

40
ForestSDMC

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

58
fmucar

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

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

そして、テーブル名を知るようになると置き換えます

String query =strQuery.replace("$tableName",tableName);
stmt =conn.prepareStatement(query);
8
trojan