web-dev-qa-db-fra.com

Comment utiliser une variable de nom de table pour un Java insert d'insertion préparé

J'utilise un Java PreparedStatment objet pour construire une série de requêtes INSERT par lots. L'instruction de requête est du format ...

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

... donc les deux valeurs de champ et le nom de la table sont des variables (c'est-à-dire que j'ai plusieurs tables avec le même format de colonne dont chaque insert sera dirigé vers une autre). Je peux faire fonctionner les exécutions si je supprime le "?" variable de nom de table et code en dur, mais chaque instruction préparée sera insérée dans une table différente et doit donc rester une variable que je remplis immédiatement avant d'exécuter la requête par lots à l'aide de ...

stmt.setString(1, "tableName1");

Comment puis-je laisser cela être une variable dynamique s'il vous plaît?

40
ForestSDMC

Tu ne peux pas. Vous devez construire le sql avec la concaténation de chaîne/espace réservé avec String.format. l'instruction préparée concerne les valeurs de colonne et non le nom de la table.

58
fmucar

Vous pouvez utiliser un espace réservé à la place du nom de la table, puis le remplacer par votre nom de table.

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

et remplacez quand vous connaissez le nom de la table

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